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
相关产品推荐
相关产品推荐

