链表两两交换(Swap Nodes in Pairs)代码遇无限循环,求问题排查
嘿,我完全懂你面试复习卡在这里的烦躁!链表两两交换时出现无限循环,大多是指针移动逻辑错误或者节点引用形成了闭环,我给你梳理几个最常见的坑:
1. 指针未正确推进,反复处理同一组节点
这是最常见的原因!交换完当前的两个节点后,你必须把处理指针移动到下一组的起始位置。比如你用curr作为当前处理的前驱节点,交换完curr.next和curr.next.next后,curr需要更新为交换后的第一个节点(也就是curr.next.next),作为下一组的前驱。如果忘记移动curr,或者移动的位置不对,就会一直在原地重复交换同一对节点,直接触发无限循环。
2. 交换时形成循环引用
交换节点的逻辑顺序错了很容易出问题。举个正确的交换逻辑示例(以Python为例):
# 假设用虚拟头节点dummy,curr初始指向dummy first = curr.next second = curr.next.next # 先把第一个节点的next指向第二个节点的下一个节点,避免断链 first.next = second.next # 再把第二个节点指向第一个节点 second.next = first # 最后把前驱节点指向第二个节点,完成交换 curr.next = second # 推进curr到下一组的前驱位置 curr = first
如果你先执行second.next = first,再处理first.next,就可能让first.next还指向second,导致这两个节点互相引用形成小闭环,进而触发整个链表的无限循环。
3. 边界条件处理不当
如果你的循环条件只判断了curr.next存在,没判断curr.next.next存在,当链表长度为奇数时,最后一个节点没有下一个节点,继续操作会让指针指向None的next,导致指针混乱,甚至形成循环。正确的循环条件应该是while curr.next and curr.next.next:。
4. 虚拟头节点使用失误
很多人用虚拟头节点来简化头节点交换的边界处理,但如果循环结束后错误地返回了虚拟头节点的错误指向,或者虚拟头节点的指针在交换过程中被错误修改,也可能导致循环。
要是能把你的代码贴出来,我就能帮你精准定位问题啦!先对照上面的几点自查一下,大概率能找到问题所在~
内容的提问来源于stack exchange,提问作者Haki Dehari

