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

单链表的反转问题是一道很基本的问题。题目如下:
有一个单链表 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;   
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值