【问题标题】:How to call/instantiate linked list如何调用/实例化链表
【发布时间】:2021-06-23 04:28:42
【问题描述】:

我正在尝试调用/打印以下链接列表:

#--the following code is taken from the most upvoted solution at codesignal--
 class ListNode(object):
   def __init__(self, x):
     self.value = x
     self.next = None

def removeKFromList(l, k):
    c = l
    while c:
        if c.next and c.next.value == k:
            c.next = c.next.next
        else:
            c = c.next
    return l.next if l and l.value == k else l

我想用l = [3, 1, 2, 3, 4, 5] and k = 3 调用/实例化这个类,我期待它返回=> [1, 2, 4, 5] 基本上,我无法先实例化ListNode 类,然后在其中调用removeKFromList 方法。 您可以在以下位置找到此挑战:https://app.codesignal.com/interview-practice/task/gX7NXPBrYThXZuanm/description

说明:

注意:尝试使用 O(1) 额外空间在 O(n) 时间内解决此任务,其中 n 是列表中元素的数量,因为这是在面试中要求你做的事情。

给定一个整数 l 和一个整数 k 的单链表,从列表 l 中删除所有值等于 k ​​的元素。

示例

对于l = [3, 1, 2, 3, 4, 5]k = 3,输出应该是

removeKFromList(l, k) = [1, 2, 4, 5]

对于l = [1, 2, 3, 4, 5, 6, 7]k = 10,输出应该是

removeKFromList(l, k) = [1, 2, 3, 4, 5, 6, 7]

输入/输出

执行时间限制:4秒(py3)

输入: linkedlist.integer l

一个整数的单链表。

保证约束:

  • 0 ≤ 列表大小 ≤ 105,
  • -1000 ≤ 元素值 ≤ 1000。

输入: integer k

一个整数。

保证约束:

  • -1000 ≤ k ≤ 1000。

输出linkedlist.integer

返回 l 并删除所有等于 k 的值。

【问题讨论】:

  • “我不能”是什么意思?你试过什么?
  • 从字面上看,我想用一些 INPUT 测试它,我想得到一些 OUTPUT
  • 你认为应该使用什么函数将 Python 列表转换为 ListNodes 的链表? (提示:你还没有尝试编写这样的函数。)
  • 这能回答你的问题吗? Python Linked List
  • 这是一个挑战。要求我们为您提供解决方案是作弊。

标签: python class linked-list call instantiation


【解决方案1】:

看你做的cmet,这里有一些误解需要解决:

如何创建列表

您似乎希望其中之一创建一个列表:

a = ListNode({}) 

a = ListNode

两者都不是您需要的。 ListNode 构造函数将创建一个潜在链接列表的 one 节点,但您必须“自己”建立链接。将{} 传递给该构造函数没有什么意义:{} 是一个字典,与此数据结构无关。第二种形式甚至不会调用构造函数,它只是将类对象复制到你的变量a,这不是你想要的。

用非常冗长的话来说,示例列表是这样创建的:

l = ListNode(3)
l.next = ListNode(1)
l.next.next = ListNode(2)
l.next.next.next = ListNode(3)
l.next.next.next.next = ListNode(4)
l.next.next.next.next.next = ListNode(5)

这应该突出一个列表是如何创建的,但当然它看起来不是很实用。往下看会有更好的方法。

如何调用函数

您在 cmets 中提到了以下调用:

a.removeKFromList([1,2,3], 3)

但这有两个问题:

  1. 它假定removeKFromListListNode 的一个方法(因为你在它前面加上a.),但它应该是一个普通函数,而不是一个方法

  2. 第一个参数是标准列表,但代码质询告诉您它需要一个链表作为第一个参数

您需要按如下方式调用您的函数:

result = removeKFromList(l, 3)

实用功能

要测试您的代码,请添加以下函数,这将帮助您(从标准列表)实例化链表并验证链表的内容(通过迭代其值):

def createList(lst):
    head = None
    for val in reversed(lst):
        node = ListNode(val)
        node.next = head
        head = node
    return head

def iterList(head):
    while head:
        yield head.value
        head = head.next

这些将简化您的测试。

所以现在您的驱动程序代码——用于将输入转换为输出——可以是:

# define the input
l = createList([3, 1, 2, 3, 4, 5])
k = 3
# run your algorithm
result = removeKFromList(l, 3)
# verify it
print(*iterList(result))

这将输出给定示例的预期输出。

【讨论】:

  • 非常感谢您的详细解答,非常感谢!现在我正在尝试通过pythontutor.com 的逐步执行/信息来学习您提供的代码:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-24
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多