力扣: 反转链表

文章目录

需求

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例1:

输入:head = [1,2,3,4,5]

输出:[5,4,3,2,1]

示例2:

输入:head = [1,2]

输出:[2,1]
示例 3:

输入:head = []

输出:[]

分析

初始化:我们使用两个指针,prev 和 current。prev 用来指向反转后的链表的前一个节点(初始时为 None),current 用来遍历原链表(初始时为 head)。

遍历链表:

  • 先保存当前节点的下一个节点 next_node。
  • 将当前节点的 next 指针指向 prev,实现反转操作。
  • 更新 prev 为当前节点。
  • 更新 current 为 next_node,继续遍历。

返回新头节点:当 current 变为 None 时,prev 就是新链表的头节点,返回它即可。

双指针法

java 复制代码
public ListNode reverseList(ListNode head) {
    if( head == null || head.next == null ){
        return head;
    }
    ListNode pre = null;
    ListNode cur = head;
    while( cur != null ){
        //  先把cur的下一个节点拿出来
        ListNode nextNode = cur.next;
        //  将 cur 的下一个指向前一个
        cur.next = pre;
        pre = cur;
        cur = nextNode;
    }   
    return pre;
}

执行结果:

递归

上面的代码很容易改写为递归的写法:

java 复制代码
if( head == null || head.next == null ){
        return head;
    }
    return reverseList( null, head );
}

private ListNode reverseList(ListNode pre, ListNode cur) {
    if( cur == null ){
        return pre;
    }
    //  拿出cur的下一个
    ListNode nextNode = cur.next;
    cur.next = pre;
    return reverseList( cur, nextNode );
}

递归终止条件:

if (cur == null):当遍历到链表的末尾时(即 cur 为 null),返回 pre,这是反转后新链表的头节点。

反转节点:

ListNode nextNode = cur.next;:保存当前节点的下一个节点,以便后续操作。

cur.next = pre;:将当前节点的 next 指针指向前一个节点 pre,这一步是反转指针的核心操作。

递归调用:

return reverseList(cur, nextNode);:调用自身,传入当前节点 cur 作为新的前一个节点,和保存的 nextNode 作为当前节点,以继续反转剩余的链表。

运行结果:

结尾

以上 是我对这道算法的一些遐想和延伸, 可能不是最优解, 但是算法的优化嘛 本身就是一个思索的过程, 能在这个思索和迭代的过程中有所收获和乐趣就是在成长了, 欢迎大家一起来交流更多的解答...

相关推荐
2401_841495645 小时前
【LeetCode刷题】二叉树的直径
数据结构·python·算法·leetcode·二叉树··递归
budingxiaomoli5 小时前
优选算法-字符串
算法
我是咸鱼不闲呀5 小时前
力扣Hot100系列19(Java)——[动态规划]总结(上)(爬楼梯,杨辉三角,打家劫舍,完全平方数,零钱兑换)
java·leetcode·动态规划
qq7422349845 小时前
APS系统与OR-Tools完全指南:智能排产与优化算法实战解析
人工智能·算法·工业·aps·排程
A尘埃5 小时前
超市购物篮关联分析与货架优化(Apriori算法)
算法
.小墨迹6 小时前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
不穿格子的程序员6 小时前
从零开始刷算法——贪心篇1:跳跃游戏1 + 跳跃游戏2
算法·游戏·贪心
大江东去浪淘尽千古风流人物6 小时前
【SLAM新范式】几何主导=》几何+学习+语义+高效表示的融合
深度学习·算法·slam
铉铉这波能秀6 小时前
LeetCode Hot100数据结构背景知识之列表(List)Python2026新版
数据结构·leetcode·list
重生之我是Java开发战士6 小时前
【优选算法】模拟算法:替换所有的问号,提莫攻击,N字形变换,外观数列,数青蛙
算法