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,整个反转完成。
总结:顺序的必要性
这四步顺序不能乱:
- 必须先存
next,否则断链; - 再改
current.next完成反转; - 然后更新
previous为当前节点,给下一个节点做准备; - 最后移动
current到下一个节点。
整个过程就像把一串珠子倒过来穿:每一颗珠子先记住下一颗的位置,再把它和前一颗连起来,然后拿着当前这颗去处理下一颗——完全是符合直觉的操作,根本不需要死记硬背。
内容的提问来源于stack exchange,提问作者isilia
相关产品推荐
相关产品推荐

