【问题标题】:How to generate a linked-list from a standard list in Python如何从 Python 中的标准列表生成链表
【发布时间】:2019-08-27 17:39:54
【问题描述】:

作为更大项目的一部分,我正在尝试从标准列表生成链接列表。我已经在 SO(例如here)上查看了有关此问题的一些主题,但大多数代码的架构与我的架构大不相同(链表本身就是一个类)。只有最后一个答案与我的解决方案非常相似。

我在这里尝试完成的是创建一个生成器,其中包含一个从给定输入创建链接列表的函数(这就是为什么这里的结构是刚性的)。我也不能触摸 ListNode 类。

我尝试了以下代码,但它只返回单元素链表,列表的最后一个元素作为节点。

我有一种感觉,我很接近,但缺少一些东西。如果需要,我可以创建辅助函数,但理想情况下,我想避免它。有人有什么想法吗?哪里错了?

class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None

class Creator:

    def populate(self, in_list):
        # creating the head node
        out_list = ListNode(in_list[0])
        curr = out_list

        # iterating over input list
        for i in in_list[1:]:
            curr = curr.next
            curr = ListNode(i)

        return curr


# Below the manual approach for a list of four elements/nodes
# manual_list = ListNode(1)
# manual_list.next = ListNode(2)
# manual_list.next.next = ListNode(3)
# manual_list.next.next.next = ListNode(4)

inputs = [1,2,3,4]
result = Creator().populate(inputs)

while result:
    print(result.val)
    result = result.next

谢谢!

【问题讨论】:

  • “但大多数代码的架构与我的有很大不同(链表本身就是一个类)。”这是相当标准的,我认为最好的做法。不过,到底为什么你还要使用链表呢?老实说,在学校练习之外,我永远无法想象一个好的用例来在 python 中滚动你自己的链表实现。你几乎总是只使用一个普通的 list 对象,或者可能是一个 collections.deque 顺便说一句,你的 Creator 类可能应该只是一个常规函数,它作为一个类没有任何作用......
  • 完全正确 - 这是处理非标准数据结构的教育项目的一部分。我从来没有在日常工作中使用过这些。

标签: python linked-list


【解决方案1】:

您的方向是正确的,只需在添加新节点后处理指针分配,同时保留对第一个节点的引用并返回:

def populate(self, in_list):
    # creating the head node
    curr = ListNode(in_list[0])
    head = curr
    # iterating over input list
    for i in in_list[1:]:
      temp = ListNode(i)
      curr.next = temp
      curr = temp

    return head

完整代码:

class ListNode(object):
    def __init__(self, x):
        self.val = x
        self.next = None

class Creator:

    def populate(self, in_list):
        # creating the head node
        curr = ListNode(in_list[0])
        head = curr
        # iterating over input list
        for i in in_list[1:]:
          temp = ListNode(i)
          curr.next = temp
          curr = temp

        return head


# Below the manual approach for a list of four elements/nodes
# manual_list = ListNode(1)
# manual_list.next = ListNode(2)
# manual_list.next.next = ListNode(3)
# manual_list.next.next.next = ListNode(4)

inputs = [1,2,3,4]
result = Creator().populate(inputs)

while result:
    print(result.val)
    result = result.next

【讨论】:

  • 我很乐意提供帮助。
猜你喜欢
  • 2012-04-14
  • 2019-05-05
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 2015-04-05
相关资源
最近更新 更多