You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java单链表反转:prev/next指针法的思路直觉解析请求

单链表反转:前驱/后继指针法的设计直觉解析

单链表反转的核心逻辑,就是把每个节点的next指针从“指向后一个节点”改成“指向前一个节点”。但单链表的节点没有前驱指针,而且一旦修改当前节点的next,就会丢失原本的后继节点——这就是prev、current、next三个指针存在的意义,每一步都在解决“断链”和“找不到前驱”的问题。

指针的初始化逻辑

SinglyLinkedList<T>.Node previous = null; // 记录当前节点的前驱,初始为null(原链表头反转后是尾节点,指向null)
SinglyLinkedList<T>.Node current = list.headNode; // 从链表头开始处理每个节点
SinglyLinkedList<T>.Node next = null; // 临时存储当前节点的后继,防止改指针后断链

循环内四步:为什么必须按这个顺序?

我们用简单链表 1 -> 2 -> 3 -> null 逐步拆解:

第一步:next = current.nextNode;

这一步是提前“备份”当前节点的后继。如果不先存下current.next,等修改current.next指向previous后,就再也找不到原本的下一个节点,链表直接断链,后续节点无法处理。

  • 第一次循环:current是1,next被赋值为2,把后续节点2存起来。

第二步:current.nextNode = previous;

这一步是完成当前节点的反转——把原本指向后继的指针,改成指向前驱。

  • 第一次循环:1的next从指向2改成指向previous(null),此时1变成反转后链表的尾节点。

第三步:previous = current;

这一步是更新前驱指针,让它指向当前已经完成反转的节点。因为下一个节点反转时,需要指向这个节点作为它的前驱。

  • 第一次循环:previous从null变成1,后续处理2的时候,2的next要指向1。

第四步:current = next;

这一步是移动到下一个待处理的节点,继续重复反转流程。

  • 第一次循环:current从1变成之前备份的2,开始处理第二个节点。

循环结束后的收尾

当current变成null时,所有节点处理完成。此时previous指向原链表的最后一个节点(即反转后链表的第一个节点),把链表的头节点改成previous,整个反转完成。

总结:顺序的必要性

这四步顺序不能乱:

  1. 必须先存next,否则断链;
  2. 再改current.next完成反转;
  3. 然后更新previous为当前节点,给下一个节点做准备;
  4. 最后移动current到下一个节点。

整个过程就像把一串珠子倒过来穿:每一颗珠子先记住下一颗的位置,再把它和前一颗连起来,然后拿着当前这颗去处理下一颗——完全是符合直觉的操作,根本不需要死记硬背。

内容的提问来源于stack exchange,提问作者isilia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:55:23