【问题标题】:How to create my own input for Python linked list questions?如何为 Python 链表问题创建自己的输入?
【发布时间】:2021-12-28 16:11:15
【问题描述】:

我刚刚开始通过 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 完成”

非常感谢!

【问题讨论】:

  • Leetcode 通常有某种“驱动代码”来运行解决方案。它可能会遍历链表或执行其他操作以正确格式化您的方法返回的输出。如果您只想使用自定义测试用例进行测试,它们有一个选项卡,您无需在本地运行它
  • 1.当您执行 ListNode([1, 2, 3, 4, 5]) 时,您创建了 one 节点,其值为 [1, 2, 3, 4, 5]。 2. 您没有指定如何将ListNode 对象转换为字符串,因此print() 将简单地打印其内存位置。例如。运行您的代码,我得到输出 <__main__.ListNode at 0x215667719d0>

标签: python linked-list


【解决方案1】:

你需要两个函数:

  1. 将标准列表转换为链表(用于调用middleNode
  2. 将链表转回列表(用于打印结果)

我建议将方法添加到 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))

【讨论】:

【解决方案2】:

为了方便起见,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

【讨论】:

  • 感谢您的回复!我通过打印 print(convert_to_linked_list([1,2,3,4])) 尝试了这个 convert_to_linked_list 函数,结果是 <__main__.listnode object at>,而不是链表 1,2,3,4。请问有什么我理解错了吗?
  • 这是意料之中的,因为 ListNodes 没有覆盖 __str__ 方法——在 ListNode 上调用 print() 将输出其内存地址。也许您正在寻找print(convert_to_linked_list([1,2,3,4]).val)(它将打印链表的头部)?
  • 感谢您的及时回复!请问我应该怎么做才能打印这个链表中创建的所有内容(1、2、3、4)?
  • 添加到原始答案中。
  • 非常感谢您的回答!这很有帮助!
【解决方案3】:

当我运行这段代码时,它看起来像是在产生输出:

<__main__.ListNode object at 0x000001DCF7B5EFD0>

Process finished with exit code 0

这似乎不是您期望的输出。当我调试代码时,似乎 middleNode 跳过了 while 循环,因为默认情况下 ListNode 类 next 是 None ,它在 python 中被评估为 false 。所以只是返回慢,就是原来的ListNode。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 2013-11-24
    • 2018-02-05
    相关资源
    最近更新 更多