206. 反转链表

Posted 2016bits

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了206. 反转链表相关的知识,希望对你有一定的参考价值。

一、题目描述

反转一个单链表。

二、示例

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

三、基本思路

1、递归法

递归弄清楚两个基本部分:递归部分和终止条件

原问题:

递归部分:将从2开始的结点进行Reverse,然后将2的next指向1,并将1指向NULL

终止条件:Reverse部分只含一个结点或为空(当原问题中只含一个结点时,其子问题的Reverse部分为空)

2、迭代法                                                                                                                                                                                                                                                                                                                          迭代法也要弄清两部分:迭代过程和终止条件

迭代部分:注意观察图中迭代前p、q与迭代后p、q的变化。在改变指针之前务必先保存原有链的信息(即r = q->next),然后再断链,更新p、q                                                                                                       

终止条件:q指向部分为空

迭代完成后,注意更新新链的头和尾,即:尾部为空(head->next = nullptr),新头为p

四、代码

1、递归法

/**
 * Definition for singly-linked list.
 * struct ListNode 
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) 
 *     ListNode(int x) : val(x), next(nullptr) 
 *     ListNode(int x, ListNode *next) : val(x), next(next) 
 * ;
 */
class Solution 
public:
    ListNode* reverseList(ListNode* head) 
        if (head == nullptr || head->next == nullptr) 
            return head;
        
        ListNode *nhead = reverseList(head->next);
        head->next->next = head;
        head->next = nullptr;
        return nhead;
    
;

2、迭代法

/**
 * Definition for singly-linked list.
 * struct ListNode 
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) 
 *     ListNode(int x) : val(x), next(nullptr) 
 *     ListNode(int x, ListNode *next) : val(x), next(next) 
 * ;
 */
class Solution 
public:
    ListNode* reverseList(ListNode* head) 
        if (head == nullptr || head->next == nullptr) 
            return head;
        
        ListNode *p = head, *q = head->next, *r;
        while (q != nullptr) 
            r = q->next;
            q->next = p;
            p = q;
            q = r;
        
        head->next = nullptr;
        return p;
    
;

 

以上是关于206. 反转链表的主要内容,如果未能解决你的问题,请参考以下文章

刷题9:反转链表

LeetCode JavaScript实现 反转链表(三种思路)

LeetCode 206. 反转链表

每天一道面试题LeetCode 206 -- 反转链表

leetcode-206-反转链表

206链表-反转链表