单链表逆序详解
FWD from :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;
}