单链表逆序详解
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;
}
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;
}
相关文章推荐
- 单链表逆序详解
- 单链表逆序详解
- C/C++ 双链表之逆序的实例详解
- 简单算法 - 链表逆序思路详解
- 单链表逆序详解
- 设计鲁棒性的方法:输入一个链表的头结点,逆序遍历打印该链表出来
- 链表的各类操作详解
- 数据结构实验之链表二:逆序建立链表
- C语言单链表实现19个功能完全详解
- leetcode——Reverse Linked List II 选择链表中部分节点逆序(AC)
- 关于链表的逆序排列!
- c++中对单链表操作---合并两个链表&&单链表逆序&&删除链表中的中间结点
- 【2117】数据结构实验之链表二:逆序建立链表
- 单链表逆序、反转
- 链表逆序输出
- 数据结构实验之链表二:逆序建立链表
- 单向链表的增、删、逆序实现
- 典型的几个链表操作-逆序和重排
- C语言单链表实现19个功能完全详解
- 面试题16:链表逆序