在Python

时间:2018-05-12 17:06:01

标签: python-3.x oop infinite-loop singly-linked-list

我使用Python 3.6实现了一个链表,链表本身运行良好,但问题是当我尝试创建以下示例时:

3 -> 1 -> 5 -> 9 ->
                   7 -> 2
          4 -> 6 ->

这意味着我有2个链接列表,在某一点上它们共享相同的元素(7,2),我的链表的代码如下:

class Element:    
    def __init__(self,value):
        self.next = None 
        self.value = value

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

    def append(self,new_element):
        current = self.head
        if current:
            while current.next:
                current = current.next
            current.next = new_element
        else:   
            self.head = new_element

    def print_linked(self):
        current = self.head
        while current:
            print(current.value, end=" ")
            current = current.next

e1 = Element(3)
e2 = Element(1)
e3 = Element(5)
e4 = Element(9)

e1p = Element(4)
e2p = Element(6)

e1s = Element(7)
e2s = Element(2)

# Start setting up a LinkedList
ll = LinkedList(e1)
ll.append(e2)
ll.append(e3)
ll.append(e4)
ll.append(e1s)
ll.append(e2s)

l2 = LinkedList(e1p)
l2.append(e2p)
l2.append(e1s)
l2.append(e2s)

当我尝试打印任何链接列表时,程序总是在最后一个元素处于无限循环中,当我尝试共享同一元素时,

3 1 5 9 7 2 2 2 2 2 2 2 [...] 

我错过了什么吗?感谢帮助。感谢

1 个答案:

答案 0 :(得分:1)

让我们来看看:

ll.append(e2)
ll.append(e3)
ll.append(e4)
ll.append(e1s)
ll.append(e2s)

在此代码运行后,最后一项(e2s)的内部状态是指向无处。

但是:

l2.append(e2p)
l2.append(e1s)
l2.append(e2s)

这使得最后一项指向自身(l2.append(e2s)附加而不考虑周期)。您迭代整个列表并附加项目,即使它已经存在

因为状态是节点的内部(Element),所以您可能有两个选择:

  1. 不要分享州(制作副本)
  2. 检查节点的退出情况,不要让它在列表中重复
  3. 如果有重复的项目,您可以提出错误:

    def append(self,new_element):
        current = self.head
        if current is new_element:
            raise ValueError('can not duplicate node %s on list' % new_element)
        if current:
            while current.next:
                current = current.next
            current.next = new_element
        else:   
            self.head = new_element