LeetCode 206. 反转链表 思考分析

138 阅读1分钟

题目
反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

迭代+双指针

从某公众号(代码随想录)搬过来的gif图:看了能很好地理解转置的过程
在这里插入图片描述

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* pre = nullptr;
        ListNode* cur = head;
        ListNode* tmp;
        while(cur != NULL)
        {
           //临时结点,暂存当前节点的下一个节点,用于后移
           tmp = cur->next;
           //当前节点指向它前面的节点(完成转置)
           cur->next = pre;
           //前指针后移
           pre = cur;
           //当前指针后移
           cur = tmp;
        }
        return  pre;
    }
};

在这里插入图片描述

递归解

递归思路:
在这里插入图片描述
递归动态图:
在这里插入图片描述
主要思路:
head 的下一个节点指向head
具体实现步骤过程见:
leetcode-cn.com/problems/re…

递归模板;

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
    	//终止条件:
    	//终止条件是当前节点或者下一个节点==null
    	//终止条件为何是这个?第一个head是null,防止一开始传入的就是空指针
    	//若一开始传入的就是空指针,则会返回空指针
    	//若一开始传入的是head+null,则会直接返回head
    	//若一开始传入的是head+node2+...+null,则正常递归返回
        if(head ==NULL || head->next == NULL)
        {
            return head;
        }
        //调用递归+逻辑
        //在函数内部,改变节点的指向,也就是 head 的下一个节点指向 head 递归函数
        ListNode* cur = reverseList(head->next);
        head->next->next = head;
        //防止链表循环,需要将head.next设置为空,此时原来的head变为尾部
        head->next = NULL;
        return cur;
    }
};

在这里插入图片描述