您的位置:首页 > 其它

单链表逆序详解

2011-10-21 12:04 351 查看
http://blog.sina.com.cn/s/blog_71319eae0100tlz7.html

1、具有链表头的单链表

一段单链表逆序的程序

typedef struct student

{

int number;

char name[20];

int score;

struct student *next;

}student;

student *reverse(student *stu)

{

student *p1,*p2,*p3;

if(stu == NULL ||stu->next == NULL)

return stu;

p1=stu->next;
//p1指向链表头节点的下一个节点

p2=p1->next;

p1->next=NULL;

while(p2)

{

p3=p2->next;

p2->next = p1;

p1=p2;

p2=p3;

}

printf("p1 = %d,next = %d\n ",p1->number,p1->next->number);

stu->next=p1;
//将链表头节点指向p1

return stu;

}

分析:

假设需要逆序的单链表为:





则逆序以后的链表为:



过程:

(1)取p1指向header->next p1=stu->next;

p2保留p1->next
p2=p1->next;

将p1->next置为NULL,因为单链表逆序以后,当前的p1节点为尾节点
p1->next=NULL;



(2)取p3保留p2->next
p3=p2->next;

将p2插入p1之前
p2->next = p1;

p1指向p2指向的节点 p1=p2;

p2指向p3指向的节点 p2=p3;





循环一次修改以后的单链表如下:



(3)重复步骤(2)



循环一次修改以后的单链表如下:



(4)将header->next指向p1,完成整个单链表的逆序



2、无链表头的单链表

一段单链表逆序的程序

typedef struct student

{

int number;

char name[20];

int score;

struct student *next;

}student;

student *reverse2(student *stu)

{

student *p1,*p2,*p3;

if(stu == NULL ||stu->next == NULL)

return stu;

p1=stu; //p1指向链表的第一个节点

p2=p1->next;

p1->next = NULL;

while(p2)

{

p3=p2->next;

p2->next = p1;

p1=p2;

p2=p3;

}

printf("p1 = %d,next = %d\n ",p1->number,p1->next->number);

stu=p1;
//将链表第一个节点指向p1

return stu;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: