单链表与双向链表的逆序实现详解
链表结构与反转操作核心原理
单链表由数据节点和单向指针构成,每个节点仅存储后继节点引用。双链表在单链表基础上增加前驱指针,形成双向连接结构。链表逆序操作需重新定向节点指针,同时确保头节点引用的正确更新。
单链表结构示意图:
![]()逆序过程中,需逐节点调整指针方向。以当前节点为基准,将其next指针指向原前驱节点,同时保存后续节点引用防止断裂。最终原尾节点成为新头节点,原头节点成为尾节点且next置空。
若未正确更新头指针,JVM垃圾回收机制将回收失去引用的中间节点内存。因此必须通过返回值更新调用方的头指针引用。
单链表逆序实现:
public class SingleList {
static class ListNode {
int data;
ListNode next;
ListNode(int value) { data = value; }
}
public static ListNode invert(ListNode current) {
ListNode previous = null;
ListNode successor = null;
while (current != null) {
successor = current.next;
current.next = previous;
previous = current;
current = successor;
}
return previous;
}
}
双链表逆序过程示意图:
![]()双链表需同时调整next和prev指针。每个节点的next指向原前驱,prev指向原后继。反转后原尾节点成为新头节点。
双链表逆序实现:
public class DoubleList {
static class BiNode {
int value;
BiNode prev;
BiNode next;
BiNode(int data) { value = data; }
}
public static BiNode reverse(BiNode node) {
BiNode prior = null;
BiNode nextNode = null;
while (node != null) {
nextNode = node.next;
node.next = prior;
node.prev = nextNode;
prior = node;
node = nextNode;
}
return prior;
}
}
Java中参数传递为引用传递。方法内修改引用指向不会影响外部变量。例如:
public class RefDemo {
static class Node {
int val;
Node next;
Node(int d) { val = d; }
}
public static void alter(Node ref) {
ref = new Node(99); // 创建新对象,不影响调用方
}
public static void main(String[] args) {
Node root = new Node(10);
root.next = new Node(20);
alter(root);
System.out.println(root.val); // 输出10,外部引用未改变
}
}