Leetcode ReorderList问题:最后while循环报'NoneType'无'next'属性错误
问题分析
你遇到的'NoneType' object has no attribute 'next'错误出现在最后一个合并循环中,核心原因是快慢指针初始化错误导致前半部分链表长度短于后半部分,合并过程中LP会先变为None,后续循环尝试访问LP.next时触发错误。
具体场景:
- 当链表长度为奇数时(比如3个节点),你初始化的
fastPointer = head.next.next会让快慢指针循环直接跳过,slowPointer停在第一个节点,前半部分仅1个节点,后半部分2个节点。 - 合并时第一次迭代后,
LP会被赋值为None(因为前半部分节点的next已被置空),但此时RP仍不为空,下一次循环执行tmpLP = LP.next时就会触发None属性错误。
另外,原代码未处理head为None的边界情况,这也是需要补全的点。
修正后的代码
# Definition for singly-linked list. # class ListNode(object): # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution(object): def reorderList(self, head): # 处理空链表或单个节点的情况 if not head or not head.next: return head # 快慢指针找中点,修正fastPointer初始化 slowPointer, fastPointer = head, head.next while fastPointer and fastPointer.next: slowPointer = slowPointer.next fastPointer = fastPointer.next.next # 分割链表,断开前半部分尾部 secondPointer = slowPointer.next slowPointer.next = None # 反转后半部分链表 prev = None while secondPointer: tmp = secondPointer.next secondPointer.next = prev prev = secondPointer secondPointer = tmp # 合并两个链表 LP, RP = head, prev while RP: tmpLP, tmpRP = LP.next, RP.next LP.next = RP RP.next = tmpLP LP = tmpLP RP = tmpRP return head
关键修复说明
- 边界条件补全:新增
if not head or not head.next,覆盖空链表和单个节点的情况,避免后续代码触发不必要的错误。 - 快慢指针修正:将
fastPointer初始化为head.next,确保慢指针最终停在链表前半部分的最后一个节点,保证前半部分长度≥后半部分长度,合并时LP不会先于RP变为None。 - 分割链表时
slowPointer.next = None,彻底断开前半部分与后半部分的连接,避免出现循环引用问题。
内容的提问来源于stack exchange,提问作者Bryan Tay
相关产品推荐
相关产品推荐

