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

Python中Leetcode ListNode类的使用:链表创建与遍历问询

解决ListNode使用的两个常见问题

刚用LeetCode里的这个ListNode类的时候确实容易踩一些赋值和初始化的坑,我来逐个帮你理清楚:


一、正确分步创建链表1->3->5

你写的代码问题出在赋值方向搞反了,咱们先拆解你的错误代码:

p1 = ListNode(1)
p2 = ListNode(3)
p3 = ListNode(5)
p2 = p1.next  # 这里是把p1的next(初始默认是None)赋值给p2,而不是把p2设为p1的后继节点
p3 = p1.next.next  # 此时p1.next已经是None,访问None的next自然会报错

原ListNode的__init__方法里,self.next默认值是None,所以创建p1之后,它的next属性一开始是空的。你需要做的是让前一个节点的next属性指向后一个节点对象,而不是反过来把next的值赋给节点变量。正确的写法应该是:

# 1. 先创建三个独立的节点
p1 = ListNode(1)
p2 = ListNode(3)
p3 = ListNode(5)

# 2. 建立节点间的链接关系
p1.next = p2  # 让p1的后继指向p2,此时形成 p1 -> p2
p2.next = p3  # 让p2的后继指向p3,此时完整链表为 p1 -> p2 -> p3

# 测试输出验证
print(p1.val)               # 输出 1
print(p1.next.val)          # 输出 3
print(p1.next.next.val)     # 输出 5

核心逻辑就是:链表的串联靠的是节点的next指针指向,要把后一个节点赋值给前一个节点的next属性。


二、从列表初始化链表并分步获取节点值

首先要明确:原ListNode的__init__方法只接受单个值val和后继节点next,你直接传ListNode([1,2,4,6])的话,会把整个列表[1,2,4,6]直接赋值给节点的val属性,而不是生成一个链表。这时候这个节点的next还是默认的None,自然没法通过next获取后续节点。

要实现从列表生成链表,我们可以写一个简单的辅助函数来完成转换,之后再遍历获取每个节点的值:

第一步:写列表转链表的辅助函数

def list_to_linked_list(arr):
    if not arr:  # 空列表直接返回None
        return None
    # 创建链表的头节点
    head = ListNode(arr[0])
    current = head
    # 遍历剩余元素,逐个创建节点并串联
    for num in arr[1:]:
        current.next = ListNode(num)
        current = current.next
    return head

第二步:初始化链表并分步获取值

# 用列表生成目标链表
l1 = list_to_linked_list([1,2,4,6])

# 方式1:逐个访问next(适合短链表)
print(l1.val)                    # 输出 1
print(l1.next.val)               # 输出 2
print(l1.next.next.val)          # 输出 4
print(l1.next.next.next.val)     # 输出 6

# 方式2:循环遍历(通用方法,适合任意长度的链表)
current = l1
while current:
    print(current.val)
    current = current.next

这样就能正确获取每个节点的值了,核心是理解ListNode的每个实例都是单个节点,链表是靠节点间的next指针串联起来的,不能直接用列表初始化单个节点来生成完整链表。


内容的提问来源于stack exchange,提问作者4daJKong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:57:54