码迷,mamicode.com
首页 > 编程语言 > 详细

算法初探001——单链表反转

时间:2015-10-17 00:41:19      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:算法   单链表   链表反转   

单链表的反转问题是一道很基本的问题。题目如下:
有一个单链表 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;![这里写图片描述](http://img.blog.csdn.net/20151016235255459)
}
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;   
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

算法初探001——单链表反转

标签:算法   单链表   链表反转   

原文地址:http://blog.csdn.net/a253664942/article/details/49187795

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!