当前位置: 代码迷 >> C语言 >> 如何逆序一个链表?
  详细解决方案

如何逆序一个链表?

热度:227   发布时间:2006-12-06 21:59:32.0
如何逆序一个链表?
如何逆序一个链表?
搜索更多相关的解决方案: 链表  逆序  

----------------解决方案--------------------------------------------------------
p指向第一个结点,q指向第二个结点, r指向第三个结点
之后
p->next=NULL;
while(r->next!=NULL)
{
q->next=p;
p=q;
q=r;
r=r->next;
}
r->next=q;
head=r;

或者是新建一个结点指针p 原来的链表头指针head,且没有头结点
p->next=NULL;
while(head!=NULL)
{
head->next=p->next;
p->next=head;
head=head->next;
}
head=p;
----------------解决方案--------------------------------------------------------
第二个少了一点.....
p->next=NULL;
while(head!=NULL)
{
q=head;
q->next=p->next;
p->next=q;
head=head->next;
}
head=p;
----------------解决方案--------------------------------------------------------
以下是引用howema在2006-12-6 21:59:32的发言:
如何逆序一个链表?

也可以到数据结构版块找一下,我以前回过的.
----------------解决方案--------------------------------------------------------

thinking

[此贴子已经被作者于2006-12-7 12:43:57编辑过]


----------------解决方案--------------------------------------------------------
将开始结点摘下,链接到终端结点之后成为新的终端终点,而原来的第二个结点成为新的开始结点,返回到新链表的头指针。
if(head->next&&head->next->next){
p=head->next;
q=p->next;
p->next=NULL;
while(q){
p=q;
q=q->next;
p->next=head->next;
head->next=p;
}
return head;
}
----------------解决方案--------------------------------------------------------
void INVERT(LinkList &list) {
LinkList p,q,r;
p=list;
q=NULL;
while(p!=NULL){
r=q;
q=p;
p=p->link;
q->link=r;
}
list=q;}
----------------解决方案--------------------------------------------------------

#include"stdio.h"
#define SIZE 6
#define LEN sizeof(struct point)

struct point
{
int n;
struct point *next;
};

main()
{
struct point *p,*q,*t,*head;
int i,j;

/* Create the link */
q=p=(struct point *) malloc(LEN);
printf("int node0-n:");
scanf("%d",&p->n);
head=p;
q->next=p;
for(i=1;i<SIZE;i++)
{
p=(struct point *) malloc(LEN);
printf("int node%d-n:",i);
scanf("%d",&p->n);
q->next=p;
q=p;
}
q->next=NULL;

/*Reverse the link. */
p=head;
q=head->next;
t=q->next;
head->next=NULL;
q->next=p;
for(i=1;i<SIZE-2;q->next=p,i++)
{
p=q;
q=t;
t=t->next;
}
t->next=q;
head=t;

/* Print the reversed link*/
p=head;
for(i=0;i<SIZE;i++)
{
printf("node%d.n=%d\n",i,p->n);
p=p->next;
}

}


----------------解决方案--------------------------------------------------------
楼上,好长呀.....
void INVERT(LinkList &list) {
LinkList p,q,r;
p=list;
q=NULL;
while(p!=NULL){
r=q;
q=p;
p=p->link;
q->link=r;
}
list=q;}
是我在数据结构的一本书上摘下来的,改了一下代码(因为这本书代码有采用C++的引用,可能有些看不懂):
LinkList *INVERT(LinkList *list) {
LinkList p,q,r;
p=list;
q=NULL;
while(p!=NULL){
r=q;
q=p;
p=p->link;
q->link=r;
}
list=q;
return (list);
}

[此贴子已经被作者于2006-12-8 19:55:35编辑过]


----------------解决方案--------------------------------------------------------
  相关解决方案