樓主妳好!
看妳的代碼存在很多問題,壹個個來說明
1)首先妳代碼的報錯源於妳想用list來展開妳的SLinkedList類,在python中,除非內置的可叠代對象外,其他都需要實現__iter__()函數,才能用list來進行展開。註意:判斷壹個對象是否可叠代,請使用isinstance(obj, Iterable)來判斷obj是不是可以叠代,Iterable需要從collections中導入
2)插入的方法存在嚴重問題,按樓主的方法插入的話,因為頭節點始終在變,所以當妳需要遍歷鏈表的時候就會找不到頭節點;
3)pop的方法實現也有問題,因為是單向鏈,所以無法從末節點開始刪除,只能刪除頭節點
4)top方法的意圖未知
其他:
下面列舉了壹下我修改後的方案,做了壹些錦上添花的操作,每個基本操作都會返回鏈表對象,這樣就可以使用鏈式操作來寫代碼;叠代函數使用yield來實現,避免展開時占用不必要的內存。
另:我的展開時直接取鏈表中各個節點的元素,加了壹些關鍵註釋在代碼中;
#?-*-?coding:?utf-8?-*-class?Node:
def?__init__(self):
'''
elm:節點元素
nxt:下個節點指針
'''
self.elm,?self.nxt?=?None,?None
class?SLinkedList:
def?__init__(self):
'''
head:?鏈表頭
end_point:?鏈表尾
'''
self.head?=?None
self.end_point?=?None
def?push(self,?x):
p?=?Node()
p.elm?=?x
if?self.head?is?None:
self.head?=?p
self.end_point?=?p
return?self
self.end_point.nxt?=?p
self.end_point?=?p
return?self
def?pop(self):
'''因為實現的是壹個單鏈表,所以只能從頭開始刪除節點'''
if?self.head.nxt?is?None:
return
self.head?=?self.head.nxt
return?self
def?__iter__(self):
temp_node?=?self.head
while?temp_node?is?not?None:
yield?temp_node.elm
temp_node?=?temp_node.nxt
if?__name__?==?'__main__':
'''增加1,2,5三個元素,並刪除壹個頭節點'''
mylinklist?=?SLinkedList().push(1).push(2).push(5).pop()
print(list(mylinklist))
其實python這個語言使用鏈表有些畫蛇添足,但是如果拿來當作需求練手也無妨。
望采納,謝謝!