[英]Python Linked List Append
我為一個UnorderedList()類創建了一個append方法,它在我的IDLE窗口中工作正常但是當它被分配給大學的測試時:
my_list = UnorderedList()
my_list.append(13)
for num in my_list:
print(num, end=" ")
print()
它返回一個錯誤: AttributeError: Nonetype object has no attribute 'getNext'
。
這是append方法:
def append(self,item):
current = self.head
while current.getNext() != None:
current = current.getNext()
current.setNext(Node(item))
這是我的其他類和代碼:
class Node:
def __init__(self,initdata):
self.data = initdata
self.next = None
def getData(self):
return self.data
def getNext(self):
return self.next
def setData(self,newdata):
self.data = newdata
def setNext(self,newnext):
self.next = newnext
class UnorderedList:
def __init__(self):
self.head = None
self.count = 0
def append(self,item):
current = self.head
while current.getNext() != None:
current = current.getNext()
current.setNext(Node(item))
為什么測試會返回該錯誤以及如何修復我的追加方法?
問題在於append方法:
def append(self,item):
current = self.head
while current.getNext() != None:
current = current.getNext()
current.setNext(Node(item))
在第一次迭代中, current
的值是self.head
,最初設置為None
,並且不檢查它。
所以相反,改變這一點並在下面引入對這種情況的檢查:
def append(self,item):
current = self.head
if current:
while current.getNext() != None:
current = current.getNext()
current.setNext(Node(item))
else:
self.head = Node(item)
PS:你也在使用變量self.count
,你沒有更新。 您可能也希望更新相同的內容。
你的append方法工作正常,但它遍歷列表,直到找到最后一個節點 - 這使得它成為O(n)。 如果跟蹤最后一個節點,可以添加一個O(1):
def append_O1(self, item):
temp = Node(item)
last = self.tail
last.setnext(temp)
self.tail = temp
self.length += 1
要啟用此功能,列表類構造函數應為:
class unorderedList:
def __init__(self):
self.head = None
self.tail = None
self.length = 0
添加更多精心設計的追加方法
在開頭插入的方法
def inserAtBeginning(self, item):
newNode = Node(item)
newNode.setdata(item)
if self.listLength() == 0:
self.head = newNode
else:
newNode.setnext(self.head)
self.head = newNode
最后插入的方法
def insertAtEnd(self, item):
newNode = Node(item)
newNode.setdata(item)
current = self.head
while current.getnext() != None:
current = current.getnext()
current.setnext(newNode)
插入指定位置的方法
def insertAtPos(self, pos, item):
if pos > self.listLength() or pos < 0:
return None
if pos == 0:
self.inserAtBeginning(item)
else:
if pos == self.listLength():
self.insertAtEnd(item)
else:
newNode = Node(item)
newNode.setdata(item)
current = self.head
count = 0
while count < pos - 1:
count += 1
current = current.getnext()
newNode.setnext(current.getnext())
current.setnext(newNode)
這個O(n)實現也適用於空列表:
def append(self,item):
current = self.head
if current == None:
self.head = Node(item)
else:
while current.getNext() != None:
current = current.getNext()
current.setNext(Node(item))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.