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

如何反转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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 02:23:10