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;
    }
}
相关推荐
shehuiyuelaiyuehao5 小时前
算法31,前缀和,可被k整除的子数组
数据结构·python·算法
203号居民7 小时前
LeetCode hot 100 — 141. 环形链表2
算法·leetcode·链表
玖玥拾7 小时前
LeetCode 202 快乐数
算法·leetcode
LuminousCPP7 小时前
数据结构-二叉树(六):BFS层序遍历与完全二叉树判断|复用链式队列 + (N_0=N_2+1) 性质证明
c语言·数据结构·笔记·算法·二叉树·宽度优先
ZhouDevin8 小时前
算法论文/数据集3——CLD(TMLR2025)压缩训练集,仅保留对验证集有益的样本
人工智能·深度学习·算法·计算机视觉
Tim_108 小时前
【LeetCode】29、两数相除
算法·leetcode·职场和发展
船厂电气自动化ai大模型9 小时前
AI大模型与数学/第63课:矩阵定义、矩阵加法、标量乘法(逐级精讲)
数据结构·人工智能·深度学习·线性代数·算法
余额瞒着我当琳10 小时前
算法修炼 chapter 2 双指针进阶、盛最多水的容器、有效三角形的个数、两数之和、三数之和、四数之和
算法
你压到我腿毛了66610 小时前
C语言冒泡算法(Bubble sort)
c语言·数据结构·算法
靠沿10 小时前
贪心算法专题(三)
算法·贪心算法