LeetCode:206. 反转链表

简介

题目链接:https://leetcode.cn/problems/reverse-linked-list/description/

解决方式:链表 + 双指针/递归

这是作者学习众多大神的思路进行解题的步骤,很推荐大家解题的时候去看看题解里面大佬们的思路、想法!

推荐查看灵茶山艾府、路漫漫我不畏大佬所作题解。

双指针

解题思路:双指针。一左一右的双指针,右边的指针指向左边的指针,不过需要注意的是不要丢失下一个节点,所以需要暂时存储下一个节点。

java 复制代码
class Solution {
    public ListNode reverseList(ListNode head) {
        // 双指针
        // cur 上一个节点,pre 前驱节点
        ListNode pre = head, cur = null;
        // 迭代链表
        while(pre != null){
            // 存储 pre 节点的指向,即下一个节点,防止后续丢失
            ListNode t = pre.next;
            // 反转节点指向
            pre.next = cur;
            // 右移
            cur = pre;
            pre = t;
        }
        // 返回数据
        return cur;
    }
}

递归

解题思路:一直递,直到找到最后一个节点,即,反转之后的头节点。归的时候,往下继续执行代码时,所处状态是最后一个节点的前一个节点而非最后一个节点(第一次归的时候,这需要理解透递归的过程)。通过这个倒数第二的节点拿到下一个节点,设置下一个节点指向当前节点,同时取消当前节点的指向。

java 复制代码
class Solution {
    public ListNode reverseList(ListNode head) {
        // 递归终止条件
        if(head == null || head.next == null){  // 兼容空链表情况
            return head;
        }
        // 递归公式
        // 找到最后一个节点,即反转后的头节点
        ListNode revHead = reverseList(head.next);
        // 此时,执行 head 是最后一个节点的上一个节点(刚开始归的时候)
        // 得到下一个节点
        ListNode tail = head.next;
        // 下一个节点指向上一个节点,即当前节点
        tail.next = head;
        // 当前节点的下一个节点指针置为 null,防止循环
        head.next = null;
        // 返回反转后的头节点
        return revHead;
    }
}
相关推荐
秋天的怀念_David1 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院2 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng2 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
j7~5 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py6 小时前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
Shaoshing7 小时前
LeetCode100 42.接雨水
java·算法·leetcode
域限奇点访客7 小时前
用AI生成问卷的网站怎么选?看题目录入结构、题型映射和生成后的校验
算法
文丑颜不良啊8 小时前
LeetCode1261~1280题目解析
java·leetcode
not coder8 小时前
一文讲通--从树到红黑树
数据结构·算法
octopus_c8 小时前
C++ 入门
开发语言·c++·算法