【问题标题】:Converting a list to a linked list将列表转换为链表
【发布时间】:2015-10-11 18:20:45
【问题描述】:

我正在尝试将列表转换为链接列表。 我已经有一个链接类,但我正在尝试弄清楚如何将列表转换为链接列表,例如:

def list_to_link(lst):
    """Takes a Python list and returns a Link with the same elements.

    >>> link = list_to_link([1, 2, 3])
    >>> print_link(link)
    <1 2 3>
    """


class Link:

    empty = ()

    def __init__(self, first, rest=empty):
        assert rest is Link.empty or isinstance(rest, Link)
        self.first = first
        self.rest = rest

def print_link(link):
    """Print elements of a linked list link."""

    >>> link = Link(1, Link(2, Link(3)))
    >>> print_link(link)
    <1 2 3>
    >>> link1 = Link(1, Link(Link(2), Link(3)))
    >>> print_link(link1)
    <1 <2> 3>
    >>> link1 = Link(3, Link(Link(4), Link(5, Link(6))))
    >>> print_link(link1)
    <3 <4> 5 6>
    """
    print('<' +helper(link).rstrip() +'>')

【问题讨论】:

  • 为什么需要链表?它会提供什么样的功能? (标准列表尚未提供)
  • 它只是一个作业练习。我猜他们希望我们将链表视为一个可变函数,但我对如何解决这个问题感到困惑。
  • 谢谢!我去看看
  • 我认为这与链表不太一样。您已将所有 Links 嵌套到一个 Link 中。

标签: python list linked-list


【解决方案1】:

我有一个使用虚拟 ListNode 的想法。这使得代码简单整洁。

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


def lst2link(lst):
    cur = dummy = ListNode(0)
    for e in lst:
        cur.next = ListNode(e)
        cur = cur.next
    return dummy.next

【讨论】:

    【解决方案2】:

    Matt 的回答很好,但是超出了上面问题中描述的函数原型的约束。

    阅读摘要/原型,看起来问题的创建者希望使用递归/动态编程方法来解决这个问题。这是一个非常标准的递归算法介绍。更多的是理解如何编写优雅的递归代码,而不是在 Python 中创建链表(不是真正有用或常见的)。

    这是我想出的解决方案。试试看:

    class Link:
        empty = ()
    
        def __init__(self, first, rest=empty):
            assert rest is Link.empty or isinstance(rest, Link)
            self.first = first
            self.rest = rest
    
    
    def print_link(link):
        """Print elements of a linked list link.
        """
        print('<' + helper(link).rstrip() +'>')
    
    
    def list_to_link(lst):
        """Takes a Python list and returns a Link with the same elements.
        """
        if len(lst) == 1:
            return Link(lst[0])
        return Link(lst[0], list_to_link(lst[1:]))  # <<<< RECURSIVE
    
    def helper(link):
        if isinstance(link.first, Link):
            first = '<' + helper(link.first).rstrip() + '>'  # <<<< RECURSIVE
        else:
            first = str(link.first)
    
        if link.rest != Link.empty:
            return first + ' ' + helper(link.rest)  # <<<< RECURSIVE
        else:
            return first + ' '
    
    def main():
        """ Below are taken from sample in function prototype comments
        """
        link = list_to_link([1, 2, 3])
        print_link(link)
    
        link = Link(1, Link(2, Link(3)))
        print_link(link)
        link1 = Link(1, Link(Link(2), Link(3)))
        print_link(link1)
        link1 = Link(3, Link(Link(4), Link(5, Link(6))))
        print_link(link1)
    
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

      【解决方案3】:

      这就是你想要的。

      class Node(object):
          def __init__(self, value, next=None):
              self.value = value
              self.reference = next
      
      class LinkedList(object):
          def __init__(self, sequence):
              self.head = Node(sequence[0])
              current = self.head
              for item in sequence[1:]:
                  current.reference = Node(item)
                  current = current.reference
      a = range(10)
      li = LinkedList(li)
      current = li.head
      while current is not None:
          print current.value
          current = current.reference
      

      【讨论】:

      • 好的,谢谢,我还没有学习 Nodes,所以我不太了解代码,但感谢您的输入!
      • @d'chang 该节点是一个容器,带有一个value 和一个指向下一个节点的指针,即reference。尝试运行代码,您会看到它将 Python 列表转换为 LinkedList。不过,您似乎改变了问题。
      • 哦,对不起@Matt。我做到了。我想出了前面的问题,如果不清楚,我很抱歉。我会改回来以适应您的回答
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      相关资源
      最近更新 更多