我使用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 [...]
我错过了什么吗?感谢帮助。感谢
答案 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
),所以您可能有两个选择:
如果有重复的项目,您可以提出错误:
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