单链表头尾交换函数出现无限输出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为例,你的步骤遗漏了原尾节点前驱的链接修正:
- 你只修改了原头节点的
next为null,但原尾节点(7k)的前驱节点是6k(数据3),它的next仍然指向原尾节点7k。 - 当你把7k设为新头节点,并让
7k.next=5k后,链表的结构变成了:
这里6k的7k(4)→5k(2)→6k(3)→7k(4)→5k(2)→...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
相关产品推荐
相关产品推荐

