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

单链表头尾交换函数出现无限输出Bug,求思路验证与问题排查

单链表头尾交换导致无限输出问题排查

你写的reversePI方法想要实现单链表头尾节点交换,但运行display时出现无限输出,核心问题是链表中形成了循环引用,你的实现思路遗漏了关键的链接修正步骤。

你的代码实现

交换方法reversePI

public void reversePI() {
        Node N1 = this.tail;
        Node Helper = this.head.next;
        this.tail = this.head;
        this.tail.next = null;
        this.head = N1;
        this.head.next = Helper;
        this.display();
    }

遍历打印方法display

public void display() {
            Node current = this.head;
            while (current != null) {
                System.out.print(current.data + " " ); 
                current = current.next;
            }
        }

错误原因分析

以你假设的链表1(4k)→2(5k)→3(6k)→4(7k)→null为例,你的步骤遗漏了原尾节点前驱的链接修正:

  1. 你只修改了原头节点的next为null,但原尾节点(7k)的前驱节点是6k(数据3),它的next仍然指向原尾节点7k。
  2. 当你把7k设为新头节点,并让7k.next=5k后,链表的结构变成了:
    7k(4)→5k(2)→6k(3)→7k(4)→5k(2)→...
    
    这里6k的next还是7k,形成了循环,display方法的while循环永远无法遇到null,导致无限输出。

修正方案

必须找到原尾节点的前驱,修改它的next指向新的尾节点(原头节点),同时处理边界情况(空链表或只有一个节点):

public void reversePI() {
    // 空链表或只有一个节点,无需交换直接打印
    if (head == null || head.next == null) {
        display();
        return;
    }

    Node oldHead = head;
    Node oldTail = tail;
    // 找到原尾节点的前驱节点
    Node prevTail = head;
    while (prevTail.next != oldTail) {
        prevTail = prevTail.next;
    }

    // 更新头尾指针
    head = oldTail;
    tail = oldHead;

    // 修正链接,避免循环
    head.next = oldHead.next; // 新头指向原头的下一个节点
    prevTail.next = tail;     // 原尾前驱指向新尾(原头)
    tail.next = null;         // 新尾的next置空,确保链表终止

    display();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 15:40:38