<LeetCode OJ> 206. Reverse Linked List

206. Reverse Linked List


Total Accepted: 74536  Total Submissions: 200484  Difficulty: Easy

Reverse a singly linked list.

click to show more hints.

Hint:

A linked list can be reversed either iteratively or recursively. Could you implement both?



分析:DONE

利用三个指针,pre,cur,next,遍历链表,遍历的过程改变他们的指向
pre的作用,cur指针所要反指回来的节点
cur的作用,操作当前节点进行逆置
next的作用,始终先跑到下一个将要逆置的节点位置

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head==NULL)
            return head;
        //初始化
        ListNode* pPreNode=head;
        ListNode* pCurNode=head->next;
        pPreNode->next=NULL;
        ListNode* pNextNode=NULL;
        while(pCurNode!=NULL)
        {
            pNextNode = pCurNode->next; //准备下一个位置
            pCurNode->next = pPreNode;//逆置
            //pPreNode 和 pCurNode 后移一位 
            pPreNode = pCurNode; //cur变成前一个
            pCurNode = pNextNode;//next变为当前节点
        }
        head = pPreNode; //退出循环是只有pPreNode指针指向实体节点,另外两个已经为NULL
        return head;
    }
};

某年某月改写:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(head==NULL || head->next==NULL)
            return head;
        ListNode* pre=NULL;
        ListNode* cur=head;
        ListNode* tmpcur=NULL;
        while(cur!=NULL)
        {
            tmpcur=cur;
            //准备下一组翻转,这行代码必须放在这里
            cur=cur->next;
            //翻转
            tmpcur->next=pre;
            pre=tmpcur;
        }
        head=tmpcur;
        return head;
    }
};


单链表的反转问题是一道很基本的问题。题目如下: 
有一个单链表:1 ->2->3->4->5->6 

反转后链表为:6->5->4->3->2->1.

解析:可以使用三个指针pre ,temp,next对逐个节点进行反转。

详细流程如下: 


(1) 初始状态
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)如此循环下去,直到最后一个节点被反转。


注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!

原文地址:http://blog.csdn.net/ebowtang/article/details/50531851

原作者博客:http://blog.csdn.net/ebowtang

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值