You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
关键说明
  1. 链表的核心逻辑是通过next指针遍历,所有列表的操作(索引、len、remove)都不能直接用在链表上;
  2. 排序链表的重复元素是连续的,所以去重时只需要比较当前节点和前一个节点的值即可,不需要额外存储所有元素;
  3. 方案2更接近链表的原生操作,效率比方案1更高(不需要额外的列表存储)。

内容的提问来源于stack exchange,提问作者Georgi Tashev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:10:17