您的位置:首页 > 其它

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

2015-10-17 00:13 260 查看
单链表的反转问题是一道很基本的问题。题目如下:

有一个单链表 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息