我刚刚开始通过LeetCode学习Python。我的问题是876";"链表中间";。解决方案如下:
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def middleNode(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow
从LeetCode,当输入为[1,2,3,4,5]时,输出为[3,4,5]。当我在自己的IDE中运行这段代码时,我可以问一下如何创建自己的输入吗?我尝试了以下
head = ListNode([1,2,3,4,5])
print(Solution().middleNode(head))
但它并没有向我显示正确的输出[3,4,5],相反,它显示了";进程结束,退出代码为0";
非常感谢!
您需要两个函数:
- 将标准列表转换为链表的一个(用于调用
middleNode
( - 一个用于将链接列表转换回列表(用于打印结果(
我建议将方法添加到ListNode
类中。第二个可能实际上是__iter__
,这样链表就可以迭代,然后只需要在打印语句中放入*
操作符:
class ListNode(object):
def __init__(self, val=0, next=None):
self.val = val
self.next = next
@classmethod
def of(Cls, lst):
head = None
for val in reversed(lst):
head = Cls(val, head)
return head
def __iter__(self):
head = self
while head:
yield head.val
head = head.next
class Solution(object):
def middleNode(self, head):
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow
head = ListNode.of([1,2,3,4,5])
print(*Solution().middleNode(head))
LeetCode允许您使用Python列表表示法指定链表,因为您可以在浏览器中执行自定义单元测试。该函数实际上并不接受链接列表;如果你在本地运行东西,你必须从一个普通的Python列表转换为一个链表。
您所做的转换不太正确:您所做是创建一个新的ListNode,它的val
字段设置为列表[1, 2, 3, 4, 5]
,next
字段设置为None。
以下是您要查找的内容(迭代输入列表中的每个元素,并将它们插入到链接列表中(:
def convert_to_linked_list(input_list):
head = None
for i in range(len(input_list) - 1, -1, -1):
new_head = ListNode(input_list[i], head)
head = new_head
return head
编辑:打印链接列表中的值(如后续要求(:
ll = convert_to_linked_list([1, 2, 3, 4])
current = ll
while current is not None:
print(current.val)
current = current.next
当我在我的端上运行这段代码时,它看起来像是在产生一个输出:
<__main__.ListNode object at 0x000001DCF7B5EFD0>
Process finished with exit code 0
它似乎并不是你所期望的输出。当我调试代码时,middleNode似乎跳过了while循环,因为默认情况下,ListNode类的下一个是None,在python中它的计算结果为false。所以它只是缓慢地返回,这就是最初的ListNode。