LeetCode206. 反转链表

题目:反转一个单链表。

复制代码
struct ListNode* reverseList(struct ListNode* head){
    if(head == NULL || head->next == NULL)
        return head;

    struct ListNode* n1 = NULL, *n2 = head, *n3 = head->next;
    while(n2)
    {
        // 反转
        n2->next = n1;

        // 迭代
        n1 = n2;
        n2 = n3;
        if(n3)
            n3 = n3->next;
    }
    return n1;
}

"反转单链表"功能,将形如 1->2->3->4->5->NULL 的链表就地修改为 5->4->3->2->1->NULL。它采用的是三指针法,核心思想是在遍历链表的过程中,逐个打断原本的节点指向并让其"掉头"。

1. 边界条件拦截

复制代码
if(head == NULL || head->next == NULL)
    return head;

如果传入的链表是空的,或者里面只有一个节点,那么反转后的结果就是它本身,直接返回 head 即可,无需执行后续逻辑。

2. 初始化三个核心指针

代码开头定义了三个相互配合的指针:

  • n1(前驱指针) :初始化为 NULL。原链表的第一个节点(头节点)在反转后会变成最后一个节点(尾节点),它的 next 必须指向 NULL,这就是 n1 初始为 NULL 的原因。
  • n2(当前指针) :初始化为 head。它代表当前正在被处理(准备掉头)的节点。
  • n3(后继指针) :初始化为 head->next。这正是你上一个问题中遇到的逻辑 :因为在反转时会修改 n2->next 的值,如果不提前用 n3 记住下一个节点的位置,修改指针后就会和后面的链表彻底失联。

3. 循环反转与迭代

进入 while(n2) 循环,只要当前节点还有效,就持续执行以下动作:

  • 执行反转 ( n2->next = n1;) :这是最关键的一步,直接把当前节点 n2 的指针方向反转,让它指向上一个节点 n1。
  • 指针整体平移:完成当前节点的反转后,三个指针像履带一样集体向后滑动一步,准备处理下一个节点。
  • n1 = n2;:n1 走到当前节点的位置。
  • n2 = n3;:n2 走到下一个节点的位置。
  • if(n3) n3 = n3->next;:n3 继续往前探路。这里的 if 判断是为了安全防御------当 n2 已经走到最后一个节点时,n3 已经是 NULL 了,如果强行读取 NULL->next 会引发段错误(内存访问违规)。

4. 循环结束与返回

当 n2 变成 NULL 时,说明所有节点都已经处理完毕,跳出 while 循环。

此时,n2 掉出了链表边界,而 n1恰好停留在原链表的最后一个节点上 。这个节点也就是反转后的"新头节点",因此最终返回 n1 即可将新的链表交接出去。

复制代码
struct ListNode* reverseList(struct ListNode* head){
    if(head == NULL || head->next == NULL)
        return head;

    struct ListNode* n1 = NULL, *n2 = head, *n3 = head->next;
    while(n2)
    {
        // 反转
        n2->next = n1;

        // 迭代
        n1 = n2;
        n2 = n3;
        if(n3)
            n3 = n3->next;
    }
    return n1;
}
相关推荐
白杨尚青1 小时前
C++进阶篇(五):红黑树——四条规则、三种插入情况与旋转变色
开发语言·数据结构·c++·stl·红黑树·平衡二叉树
likexuec19 小时前
数据结构(2)
数据结构
D e re k ZH21 小时前
C++ 标准库算法全景指南
数据结构·c++·算法
冻柠檬飞冰走茶21 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
十二2 天前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯
D e re k ZH2 天前
C++ 从零入门(一):基础语法与程序结构
数据结构·c++·算法
careathers2 天前
【数据结构】基于比较的排序算法 - 交换排序
数据结构·算法·排序算法
H.莓飛2 天前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
老师我太想进步了20263 天前
【数据结构-4】算法美学之顺序表
数据结构·算法
GrowingIO技术社区3 天前
CDP、行为分析、归因与营销自动化有什么区别?
数据结构·数据挖掘·数据分析