LeetCode有序链表去重问题:ListNode无len()方法报错求助
问题分析
你遇到的TypeError: object of type ListNode has no len()错误,核心原因是把链表节点(ListNode)当成了Python列表(list)来操作:
len(head):ListNode是链表的节点对象,不是列表,没有len()方法;head[i-j]:链表不能通过索引直接访问元素,只能通过next指针逐个遍历;head.remove():链表没有remove()方法,列表的操作完全不适用于链表结构。
另外,你自定义的ListNode构造函数不符合LeetCode的标准定义,多余的sequence参数没有意义,反而会干扰正常的链表逻辑。
用for循环实现的可行方案
虽然用while循环处理链表更直观,但我们可以通过两种方式用for循环完成需求:
方案1:先转列表去重,再重建链表
这种方式贴近你原本的思路,先把链表的节点值提取到列表中,用for循环完成去重,再根据去重后的列表重新构建链表:
# 按照LeetCode标准定义ListNode class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next class Solution: def deleteDuplicates(self, head: ListNode) -> ListNode: if not head: return None # 第一步:把链表所有节点值提取到列表 node_vals = [] current = head while current: node_vals.append(current.val) current = current.next # 第二步:用for循环去重(因为是排序链表,重复值连续) unique_vals = [node_vals[0]] for val in node_vals[1:]: if val != unique_vals[-1]: unique_vals.append(val) # 第三步:根据去重后的列表重建链表 dummy = ListNode() current = dummy for val in unique_vals: current.next = ListNode(val) current = current.next return dummy.next
方案2:将链表转为可迭代对象,直接用for循环遍历处理
通过生成器把链表转为可迭代对象,用for循环遍历节点,同时跳过重复值:
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next # 生成器:将链表转为可迭代对象 def iterate_nodes(head): current = head while current: yield current current = current.next class Solution: def deleteDuplicates(self, head: ListNode) -> ListNode: if not head: return None dummy = ListNode(next=head) prev = dummy # 用for循环遍历链表节点 for node in iterate_nodes(head): # 如果当前节点和前一个节点值重复,跳过 if prev.val == node.val: prev.next = node.next else: prev = node return dummy.next
关键说明
- 链表的核心逻辑是通过
next指针遍历,所有列表的操作(索引、len、remove)都不能直接用在链表上; - 排序链表的重复元素是连续的,所以去重时只需要比较当前节点和前一个节点的值即可,不需要额外存储所有元素;
- 方案2更接近链表的原生操作,效率比方案1更高(不需要额外的列表存储)。
内容的提问来源于stack exchange,提问作者Georgi Tashev
相关产品推荐
相关产品推荐

