单链表的反转问题是一道很基本的问题。题目如下:
有一个单链表 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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-19 15:43:33