终于学会链表反转了!

链表反转是一个出现频率特别高的算法题,在各大算法高频题排行网站中也长期占领前三。比如在牛客网上这个No.1好像已经好久了:

所以链表反转是我们学习链表最重要的问题,没有之一。

这篇文章是给刚入门的小白看的,今天只涉及到基础的链表反转,并不会涉及到指定区间反转、K个一组反转这种进阶题。

对于整个链表的反转,我这里给出两种方式:一种是构建虚拟头节点,一种是不构建虚拟头节点 ,其中,带虚拟头节点的是很多底层源码使用的,而不带虚拟头节点的方法是面试经常要考的,所以两种方法都要掌握。

我们先来看带虚拟头节点构造的方式。

建立虚拟头节点辅助反转

这种方法的思路是:**我们先建立一个虚拟头节点ans,然后依次遍历要反转的链表的每个节点,将其拼到虚拟头节点ans的后面就可以,整个过程如图所示:

具体到代码实现上是这样的:

java 复制代码
public ListNode reverseList(ListNode head) {
    // 建立虚拟头节点辅助反转
    
    // 建立一个虚拟头节点
    ListNode ans = new ListNode(-1);
    
    // 遍历要反转的链表
    ListNode cur = head;
    while (cur != null) {
        ListNode next = cur.next;		// 先将要遍历的下一个节点存起来
        cur.next = ans.next;				// 将当前遍历到的节点指向虚拟头节点ans的后一个节点
        ans.next = cur;							// 将ans的后一个节点指向当前遍历的节点
        cur = next;                 // cur移到下一个节点
    }
  
    return ans.next;
}

建立虚拟头节点是处理链表的经典方法之一,同时这种方法也在很多工具的源码中都有使用,因此必须掌握好。

接下来的一种方法是直接操纵链表实现反转,这种方法也是面试最常考的。

直接操作链表实现反转

为什么面试的时候不怎么考上面的一种方式呢?原因是不借助虚拟头节点的方式更难,更考察面试者的能力。

不要慌,其实你只要类比建立虚拟头节点辅助反转的方式就懂了。

上面那种方式是new了一个节点出来,所以才被称为虚拟头节点,那么你把ans的初始值搞成null不就相当于没有构建节点了嘛。

然后要反转的链表的第一个头节点在上面的一种方式中是跟在了虚拟头节点的屁股后面,现在你直接让他补了null的位置就可以了,后面的节点也是一样的。

所以,代码是这样写的:

java 复制代码
public ListNode reverseList(ListNode head) {
    // 直接操作链表实现反转
    
    ListNode ans = null;
    
    // 遍历要反转的链表
    ListNode cur = head;
    while (cur != null) {
        ListNode next = cur.next;		// 先将要遍历的下一个节点存起来
        cur.next = ans;				// 将当前遍历到的节点指向虚拟头节点ans的后一个节点
        ans = cur;							// 将ans的后一个节点指向当前遍历的节点
        cur = next;                 // cur移到下一个节点
    }
  
    return ans;
}

和上面的一对比,你会发现ans.next全部变成了ans,这也就是相当于直接占了之前建立虚拟头节点的位置了,也是很好理解的。

将上面这段代码在理解的基础上背下来,是的,因为太重要了。

好了,我们已经算是一只脚迈入链表反转的大门了,其实上面两种方式并不难,你不理解的话多在纸上画一画就懂了。

懂了之后你就可以去搞搞LeetCode206了。

我是张小yu,创作不易,请多关照。stay hungry,stay foolish。

相关推荐
朝新_11 分钟前
【优选算法】第一弹——双指针(上)
算法
艾莉丝努力练剑34 分钟前
【C++STL :stack && queue (一) 】STL:stack与queue全解析|深入使用(附高频算法题详解)
linux·开发语言·数据结构·c++·算法
CoovallyAIHub1 小时前
ICLR 2026 惊现 SAM 3,匿名提交,实现“概念分割”,CV领域再迎颠覆性突破?
深度学习·算法·计算机视觉
IT古董1 小时前
【第五章:计算机视觉-计算机视觉在工业制造领域中的应用】1.工业缺陷分割-(2)BiseNet系列算法详解
算法·计算机视觉·制造
电鱼智能的电小鱼1 小时前
服装制造企业痛点解决方案:EFISH-SBC-RK3588 预测性维护方案
网络·人工智能·嵌入式硬件·算法·制造
yan8626592461 小时前
于 C++ 的虚函数多态 和 模板方法模式 的结合
java·开发语言·算法
小此方1 小时前
C语言自定义变量类型结构体理论:从初见到精通(下)
c语言·数据结构·算法
_poplar_2 小时前
15 【C++11 新特性】统一的列表初始化和变量类型推导
开发语言·数据结构·c++·git·算法
CoovallyAIHub2 小时前
YOLO Vision 2025 还没结束!亚洲首场登陆深圳,YOLO26有望亮相
深度学习·算法·计算机视觉
寂静山林2 小时前
UVa 10447 Sum-up the Primes (II)
算法