Java LinkedList反转报错:为何方案B可行而方案A出现循环错误?
链表反转代码报错原因分析
第一段反转链表的代码运行时会抛出「Error - Found cycle in the ListNode」错误,第二段代码却能正常运行,两者看似逻辑相似,核心差异在于是否处理了原链表头节点的next指针,直接导致了环的产生。
报错的代码(方案A)
public ListNode reverseList(ListNode head) { if (head == null || head.next == null) { return head; } ListNode current = head.next; while (current != null) { //move current to front of list ListNode temp = current.next; current.next = head; head = current; current = temp; } return head; }
正常运行的代码(方案B)
public ListNode reverseList(ListNode head) { ListNode curr = head; ListNode prev = null; while (curr != null) { //move current to front of list ListNode temp = curr.next; curr.next = prev; prev = curr; curr = temp; } return prev; }
核心差异:原头节点的next指针未被重置
- 方案A中,初始
head指向原链表的第一个节点,current从第二个节点开始循环。每次循环只修改current的next指向当前head,然后更新head为current,但原第一个节点的next指针始终指向原第二个节点(也就是反转后的第二个节点)。当循环结束后,原第一个节点变成了反转链表的尾节点,但它的next并没有被设为null,而是指向反转链表的第二个节点,这样就形成了一个环:反转后的头节点 → ... → 原头节点 → 反转后的第二个节点 → ... → 原头节点,触发了环检测错误。 - 方案B中,用
prev初始化为null,每次循环将curr.next指向prev。当处理原第一个节点时,它的next会被设为null,成为反转链表的尾节点,整个链表是单向无环的,自然不会报错。
举个简单例子:假设原链表是1→2→3
- 方案A执行后,最终链表是
3→2→1,但1.next=2,形成3→2→1→2→...的环 - 方案B执行后,最终链表是
3→2→1→null,无环,正常运行
内容的提问来源于stack exchange,提问作者Ana
相关产品推荐
相关产品推荐

