嘗試用Python學習資料結構,實作雙向鏈表。當我嘗試在一個元素之后插入一個新元素時,它以連續回圈結束。請嘗試解釋我哪里出錯了以及為什么它會結束它的連續回圈。
我在這里發布了我的整個代碼,但問題出在 insertAt。請幫忙。
class Node:
def __init__(self, data):
self.data = data
self.prev = None
self.next = None
class Double_list:
def __init__(self):
self.head = None
def beginning(self, data):
node = Node(data)
if not self.head:
self.head = node
else:
temp = self.head
node.next = temp
temp.prev = node
def addelement(self, data):
node = Node(data)
if not self.head:
self.beginning(data)
return
temp = self.head
last = temp
while temp.next:
temp = temp.next
temp.next = node
node.prev = temp
def ending(self, data):
self.addelement(data)
def insertAt(self, data, after=None):
node = Node(data)
temp = self.head
while temp and after:
import pdb; pdb.set_trace()
last = temp
temp = temp.next
if last.data == after:
last.next = node
node.prev = last
node.next = temp
temp.prev = node
def remove(self,data):
temp = self.head
while temp:
if temp.data == data:
break
last = temp
temp =temp.next
last.next = temp.next
temp.next.prev = last
def printll(self):
temp = self.head
while temp:
print (temp.data, end=" ")
temp = temp.next
obj = Double_list()
obj.beginning(1)
obj.addelement(2)
obj.ending(3)
obj.insertAt(data=4,after=1)
obj.remove(2)
obj.printll()
uj5u.com熱心網友回復:
由于insertAt最多只能插入一個節點,因此您應該在添加后立即退出回圈 ( break)。因為這不會在您的代碼中發生,所以存在第二次添加相同節點(第二次after發生時)的風險,這將導致鏈表不一致。
該方法中的其他一些問題:
- 你應該保護你的演算法
temp.prev在temp碰巧是None. - while 回圈條件不應該有任何關于
after. - 該函式不使用
before,因此這不應是引數。 - 如果
after在串列中未找到該值,則不應插入任何節點,因此最好僅after在找到時創建該節點。
所以:
def insertAt(self, data, after=None): # No `before`
temp = self.head
while temp: # No condition on `after`
last = temp
temp = temp.next
if last.data == after:
node = Node(data) # <-- moved!
last.next = node
node.prev = last
node.next = temp
if temp: # avoid error
temp.prev = node
break # stop looking further
另一個備注:即使串列已經有節點,該beginning方法也應該始終執行self.head = node。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/383870.html
標籤:Python 蟒蛇-3.x python-2.7 数据结构 双向链表
下一篇:如何組裝嵌套串列元素
