下面的代码。这个想法是测试我是否正在打印链表的中间节点 - 如果列表有偶数个节点,则返回 2 个中间节点中的第一个。
但是,这甚至没有运行 - 它给了我一个类型错误:middleNode(( 缺少 1 个必需的位置参数:"head">
我给它 A 作为头部,它被定义为一个 ListNode...那么我错过了什么?为什么这没有按预期工作?
class ListNode:
def __init__(self, val = 0, next = None):
self.val = val
self.next = next
class Solution:
def middleNode(self, head):
slow = fast = head
if not fast.next:
return fast
if not fast.next.next:
return fast
while fast.next and fast.next.next:
slow = slow.next
fast = fast.next.next
return slow
if __name__ == "__main__":
A = ListNode(1)
B = ListNode(2)
C = ListNode(3)
A.next = B
B.next = C
C.next = ListNode(4)
C.next.next = ListNode(5)
C.next.next.next = ListNode(6)
print(A.next.val)
print(middleNode(A).val) #This is giving me an error
middleNode
是解决方案的一种方法,但您从未实例化过解决方案。整个最后一个 if 语句都在类中。它需要移动到左边距。这些修复将解决您的问题,但您还有其他问题,即过于冗长和代码过于分散。middleNode
应该是ListNode
的属性,因此您可以在拖动ListNode
的任何地方访问它。
你的middleNode
版本的问题在于它过于热衷于确定什么是不正确的,但随后继续检查什么是真实的。您所要做的就是自动假设它不是真的,然后检查它是否是真的。如果什么都不是真的,那么你的假设就会被传递。否则,无论真相是什么,都将被处理。你也错过了一个"啊哈!",那就是:如果有.next.next
那么肯定也有.next
。通过检查前者,隐含了后者。
class ListNode:
def __init__(self, val = 0, next = None):
self.val = val
self.next = next
#Whereas this is a shorter way to write what you wrote
#I'm not convinced that this actually does what you want it to
#I'm pretty sure you will always get 3 nodes from the end
#Or in code terms the head of .next.next.next
#It only seems to work because you only count to 6
@property
def middleNode(self):
mid = self
head = self
while head.next.next:
mid = mid.next
head = head.next.next
return mid.val
if __name__ == "__main__":
A = ListNode(1)
B = ListNode(2)
C = ListNode(3)
A.next = B
B.next = C
C.next = ListNode(4)
C.next.next = ListNode(5)
C.next.next.next = ListNode(6)
print(A.next.val)
print(A.middleNode)
这会清理您的脚本,但我不得不问:为什么不只使用列表?像这样:
nodes = [10,30,70,90,100,150,180]
print(nodes[int(len(nodes)/2)]) #virtually a middleNode