當前位置:編程學習大全網 - 編程語言 - python編程中實現linkedlist(鏈表)報錯是因為什麽,怎麽解決?

python編程中實現linkedlist(鏈表)報錯是因為什麽,怎麽解決?

樓主妳好!

看妳的代碼存在很多問題,壹個個來說明

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這個語言使用鏈表有些畫蛇添足,但是如果拿來當作需求練手也無妨。

望采納,謝謝!

  • 上一篇:數控車床30系統g76編程實例
  • 下一篇:開發壹個app的後臺需要多少時間和成本?
  • copyright 2024編程學習大全網