如何反转LinkedList且不改动原链表?现有实现致原链表被修改求助
如何反转链表且不修改原链表
你的问题出在当前的reverseList是原地反转,直接修改了原链表节点的next指针——原链表的头节点在反转时被设置为next = null,所以原链表只剩下头节点一个元素。要保留原链表,必须先复制原链表,再反转这个副本。
步骤1:实现链表复制函数
先写一个复制原链表的方法,生成一个和原链表结构、值完全相同但独立的新链表:
public ListNode copyList(ListNode head) { if (head == null) return null; // 新建头节点 ListNode newHead = new ListNode(head.val); ListNode curr = head.next; ListNode newCurr = newHead; // 逐个复制节点 while (curr != null) { newCurr.next = new ListNode(curr.val); newCurr = newCurr.next; curr = curr.next; } return newHead; }
步骤2:修改反转逻辑,反转副本链表
修改调用逻辑,先复制原链表,再反转复制后的链表:
// 先复制原链表,再反转副本 ListNode copiedHead = copyList(head); ListNode reversed = reverseList(copiedHead); // 打印原链表和反转后的链表 print(head); print(reversed);
完整代码示例
把所有部分整合起来:
public class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ListNode(int val, ListNode next) { this.val = val; this.next = next; } } public class LinkedListDemo { public ListNode reverseList(ListNode head) { ListNode prev = null; ListNode curr = head; while (curr != null) { ListNode next = curr.next; curr.next = prev; prev = curr; curr = next; } return prev; } public ListNode copyList(ListNode head) { if (head == null) return null; ListNode newHead = new ListNode(head.val); ListNode curr = head.next; ListNode newCurr = newHead; while (curr != null) { newCurr.next = new ListNode(curr.val); newCurr = newCurr.next; curr = curr.next; } return newHead; } public void print(ListNode curr) { while (curr != null) { System.out.print(curr.val + " "); curr = curr.next; } System.out.println(); } public static void main(String[] args) { // 构建原链表 [1,2,3] ListNode head = new ListNode(1); head.next = new ListNode(2); head.next.next = new ListNode(3); LinkedListDemo demo = new LinkedListDemo(); System.out.println("原链表:"); demo.print(head); ListNode copied = demo.copyList(head); ListNode reversed = demo.reverseList(copied); System.out.println("反转后打印原链表:"); demo.print(head); System.out.println("反转后的链表:"); demo.print(reversed); } }
输出结果
原链表: 1 2 3 反转后打印原链表: 1 2 3 反转后的链表: 3 2 1
这样原链表的结构完全不会被修改,反转操作只作用于复制出来的新链表。
内容的提问来源于stack exchange,提问作者Anchal Shivank
相关产品推荐
相关产品推荐

