算法初探001——单链表反转
2015-10-17 00:13
260 查看
单链表的反转问题是一道很基本的问题。题目如下:
有一个单链表 1 ->2->3->4->5->6 反转后链表为:6->5->4->3->2->1.
(4) 初始状态
![](https://img-blog.csdn.net/20151016230637874)
(2)第一次循环:
![](https://img-blog.csdn.net/20151016230623759)
pre 和 tmp 后移一位 , 第一次循环结束,第一个节点指向了头节点。
![](https://img-blog.csdn.net/20151016231025297)
(3) 第二次循环
![](https://img-blog.csdn.net/20151016231323896)
![](https://img-blog.csdn.net/20151016231434450)
(4)如此循环下去,直到最后一个节点被反转。
具体代码如下:
(1)初始状态
![](https://img-blog.csdn.net/20151016235559485)
(2)开始循环。第一次循环将节点3插入到节点1后面(代码中的步骤分别对应下图中的步骤)
![](https://img-blog.csdn.net/20151017000239045)
(3)将第一个节点加到链表尾部
![](https://img-blog.csdn.net/20151017000956464)
具体代码如下:
有一个单链表 1 ->2->3->4->5->6 反转后链表为:6->5->4->3->2->1.
方法一
解析:可以使用三个指针pre ,temp,next对逐个节点进行反转。详细流程如下:(4) 初始状态
pre = head; tmp = head->next; pre->next = null;
(2)第一次循环:
next = tmp->next; tmp->next = pre;
pre 和 tmp 后移一位 , 第一次循环结束,第一个节点指向了头节点。
pre = tmp; tmp = next;
(3) 第二次循环
next = tmp->next; tmp->next = pre;
pre = tmp; tmp = next;
(4)如此循环下去,直到最后一个节点被反转。
具体代码如下:
LinkList reverseLinkList(LinkList head){
if(head == NULL || head->next == NULL)
return head;
//创建三个辅助指针pre,tmp,next
LinkList pre,tmp,next;
//初始化 pre , tmp
pre = head;
tmp = head->next;
pre->next =NULL;
//开始遍历
while(tmp != NULL){
next = tmp->next; tmp->next = pre;
pre = tmp; tmp = next;}
head = pre;
return head;
}
方法二
解析:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾。(1)初始状态
p = head->next;
(2)开始循环。第一次循环将节点3插入到节点1后面(代码中的步骤分别对应下图中的步骤)
while(p->next){ q = p->next; (1) p->next =q->next; (2) q->next = head->next; (3) head->next = q; }
(3)将第一个节点加到链表尾部
(1)p->next=head;//相当于成环 (2)head=p->next->next;//新head变为原head的next p->next->next=NULL;//断掉环
具体代码如下:
LinkList reverseLinkList(LinkList head){ if(head == NULL || head->next == NULL) return head; LinkList p,q; p = head->next; //开始遍历 while(p->next){ q = p->next; p->next =q->next; q->next = head->next; head->next = q; } p->next=head;//相当于成环 head=p->next->next;//新head变为原head的next p->next->next=NULL;//断掉环 return head; }
相关文章推荐
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#定义并实现单链表实例解析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- C语言实现单链表逆序与逆序输出实例