【问题标题】:Error: Merge two sorted linkedlist using dummy head technique in Python错误:在 Python 中使用虚拟头技术合并两个排序的链表
【发布时间】:2021-10-21 17:40:20
【问题描述】:

我正在尝试使用虚拟头技术解决合并两个排序的链表问题。出于某种原因,我将参数传递给我的假头持有人时出错。输出假设像这样合并两个链表:1-> 1-> 2-> 3-> 7-> None

如果您能指导我的虚拟头变量中需要传递哪些数据,我会很高兴?提前致谢!这是我遇到的错误:

    dummy = LinkedList()
TypeError: __init__() missing 1 required positional argument: 'data

这是我的完整代码:


class LinkedList:
    def __init__(self, data):
        self.data = data
        self.next = None


def print_list(head: LinkedList) -> None:
    while head:
        print(head.data, end=" -> ")
        head = head.next
    print("None")


def merge_lists(headA, headB):
    dummy = LinkedList()
    curr = dummy

    while headA != None and headB != None:
        if headA.data < headB.data:
            curr.next = headA
            headA = headA.next
        else:
            curr.next = headB
            headB = headB.next

        curr = curr.next

    if headA != None:
        curr.next = headA
    else:
        curr.next = headB

    return dummy.next



node1 = LinkedList(1)
node1.next = LinkedList(2)
node1.next.next = LinkedList(7)


node2 = LinkedList(1)
node2.next = LinkedList(3)

print(merge_lists(node1, node2)) # 1-> 1-> 2-> 3-> 7-> None

【问题讨论】:

  • 您正在创建一个需要参数的对象:dummy = LinkedList()
  • 正确,我尝试将 None, "dummy" 作为参数传递,但我仍然看不到输出。例如,当我将 None 作为参数传递时,它向我显示了这样的引用: <__main__.linkedlist object at>
  • 您正在返回一个对象,这就是输出看起来像这样的原因。您可能需要另一个函数来遍历列表并打印每个节点的数据
  • 我使用了 print_list 函数而不是 print,解决了这个问题。我尝试了创建另一个这样的函数的方法: for i in range(headA + headB): print(dummy(i), end = " ") 在最终返回之后,它没有工作。你能指导我怎么做吗?谢谢!

标签: python linked-list singly-linked-list


【解决方案1】:

由于它是一个虚拟节点,并且您永远不会使用该节点的数据属性,因此您可以将任何内容作为参数传递,例如 None:

dummy = LinkedList(None)

或者,您可以指定提供参数是可选的,并按如下方式定义构造函数:

class LinkedList:
    def __init__(self, data=None):
        self.data = data
        self.next = None

不相关,但在你的脚本末尾有:

print(merge_lists(node1, node2))

这将打印对象引用。您可能想调用为此目的定义的函数:

print_list(merge_lists(node1, node2))

如果您希望print 像那样工作,那么代替print_list 函数,使用__iter__ 方法丰富LinkedList 以简化对列表中值的迭代,以及__repr__ 或@ 987654331@方法如下:

class LinkedList:
    def __init__(self, data=None):
        self.data = data
        self.next = None

    def __iter__(self):
        head = self
        while head:
            yield head.data
            head = head.next
        yield None  # Optional

    def __repr__(self):
        return " -> ".join(map(str, self))

...然后你就可以了

print(merge_lists(node1, node2))

【讨论】:

  • 是的,在我在这里发布我的代码之前我已经这样做了。经过上面的修改,还是看不到:1->1->2->3->7->None的输出。相反,它向我显示: <__main__.linkedlist object at> 这在某种程度上是一个参考。您是否知道任何其他可以显示我的输出的方式。还是谢谢!
  • 那是因为你没有使用print_list函数。使用它而不是print
  • 效果很好。太感谢了。其他人提到创建另一个函数来打印每个节点的列表而不使用 print_list 函数。有什么想法吗,再次感谢?
  • “有人提到创建另一个函数”:创建另一个打印函数的方法有数千种。不知道你的意思。
  • 对最后一部分进行了更新,以映射到字符串,并使列表可迭代。
猜你喜欢
  • 2019-02-26
  • 2015-08-13
  • 1970-01-01
  • 2014-04-25
  • 2016-03-30
  • 2011-01-21
相关资源
最近更新 更多