鏈表python
1. python編程中實現linkedlist(鏈表)報錯是因為什麼,怎麼解決
樓主你好!
看你的代碼存在很多問題,一個個來說明
1)首先你代碼的報錯源於你想用list來展開你的SLinkedList類,在python中,除非內置的可迭代對象外,其他都需要實現__iter__()函數,才能用list來進行展開。注意:判斷一個對象是否可迭代,請使用isinstance(obj, Iterable)來判斷obj是不是可以迭代,Iterable需要從collections中導入
2)插入的方法存在嚴重問題,按樓主的方法插入的話,因為頭節點始終在變,所以當你需要遍歷鏈表的時候就會找不到頭節點;
3)pop的方法實現也有問題,因為是單向鏈,所以無法從末節點開始刪除,只能刪除頭節點
4)top方法的意圖未知
其他:
下面列舉了一下我修改後的方案,做了一些錦上添花的操作,每個基本操作都會返回鏈表對象,這樣就可以使用鏈式操作來寫代碼;迭代函數使用yield來實現,避免展開時佔用不必要的內存。
另:我的展開時直接取鏈表中各個節點的元素,加了一些關鍵注釋在代碼中;
#-*-coding:utf-8-*-
classNode:
def__init__(self):
'''
elm:節點元素
nxt:下個節點指針
'''
self.elm,self.nxt=None,None
classSLinkedList:
def__init__(self):
'''
head:鏈表頭
end_point:鏈表尾
'''
self.head=None
self.end_point=None
defpush(self,x):
p=Node()
p.elm=x
ifself.headisNone:
self.head=p
self.end_point=p
returnself
self.end_point.nxt=p
self.end_point=p
returnself
defpop(self):
'''因為實現的是一個單鏈表,所以只能從頭開始刪除節點'''
ifself.head.nxtisNone:
return
self.head=self.head.nxt
returnself
def__iter__(self):
temp_node=self.head
whiletemp_nodeisnotNone:
yieldtemp_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這個語言使用鏈表有些畫蛇添足,但是如果拿來當作需求練手也無妨。
望採納,謝謝!
2. 關於python鏈表的運行
看你運行幾次,我給你一條一條說
頭 1->2->3->4->5->6->7->8->9 NONE
pointer=head #這里你沒說清,我先假設這個head是鏈表的第一個,1
newnode={ } #空字典
newnode['data']=20 #添加關鍵字data=20進字典。
newnode['next']=pointer #字典的next目標指向pointer,也就是head,也就是1,但是是鏈表這個object,不是指向一個數字
head=newnode #重新定義head為newnode這個字典。head指向{『data』:20, 『next』:pointer}這個字典。
pointer=pointer['next'] #pointer指向pointer['next'],也就是pointer現在指向鏈表的第二個,2
pointer['next']=none #pointer['next']設為none,也就是現在pointer這個鏈表就被截斷了。只包含1->2->none
3. python中的鏈表(linked list)
鳳鸞寶帳景非常,盡是泥金巧樣妝。
曲曲遠山飛翠色,翩翩舞袖映霞裳。
梨花帶雨爭嬌艷,芍葯籠煙騁媚妝。
但得妖嬈能舉動,取回長樂侍君王。
// 這題需要使用輾轉相除法,又名歐幾里德演算法(Euclideanalgorithm)
#include <stdio.h>
int main (void)
{
int m, n, p, tmp;
printf ("Please type in two number:\n");
scanf ("%i %i", &m, &n); //輸入兩個數,分別放入m, n
p=m*n; //先把兩數的積算出來,後面m和n的值會有變
while (n!=0){
tmp=m%n;
m=n;
n=tmp; //這段是求最大公約數的演算法
}
printf ("The GCD is %i\n", m); //上面的演算法n=0時m這時的值就是最大公約數
printf ("The LCM is %i\n", p/m);//兩數的積除以最大公約數就是最小公倍數了
return 0;
}
4. python 鏈表問題
classUnorderedList:
def__init__(self):
self.head=None
defadd(self,item):
new_node=Node(item)
new_node.set_next(self.head)
self.head=new_node
defsize(self):
current=self.head
count=0
whilecurrent!=None:
count=count+1
current=current.get_next()
returncount
defis_empty(self):
returnself.head==None
defadd_all(self,other_list):
foriteminother_list:
self.add(item)
returnself.head
def__iter__(self):
current=self.head
whilecurrent:
yieldcurrent
current=current.get_next()
defprint_all(self):
foriteminself:
print(item.get_data())
classNode:
def__init__(self,init_data):
self.data=init_data
self.next=None
defget_data(self):
returnself.data
defget_next(self):
returnself.next
defset_data(self,new_data):
self.data=new_data
defset_next(self,new_next):
self.next=new_next
if__name__=="__main__":
s=UnorderedList()
s.add(33)
s.add(44)
s.add_all([1,2,3,4])
s.print_all()
5. python有鏈表嗎
python中的鏈表(linked list)是一組數據項的集合,其中每個數據項都是一個節點的一部分,每個節點還包含指向下一個節點的鏈接。鏈表有兩種類型:單鏈表和雙鏈表。
鏈表的數據結構
在鏈表中刪除操作可以通過修改指針來實現,
插入則是調整,插入點的前後兩個指針的指向關系,
在python中每個變數都是指針,例如:
用內置數據結構(list,dict,tuple等)的嵌套/組合,它們隱式地包含了指向/嵌套關系,如graph[u][v]={w0,w1..}類的成員變數、嵌套類可能包含了指向/嵌套關系;
引用表示指向關系,只不過引用不能像指針一樣運算,比如p+1指向下一個元素,所以可能限制頗多。因此,要實現鏈表的操作,不能和c一樣直接對指針進行操作。
python學習網,大量的免費python視頻教程,歡迎在線學習!
6. 如何使用python建立鏈表
classListNode:
def__init__(self,x):
self.val=x
self.next=None
l1=newListNode(0)
l1.next=newListNode(1)
7. python 單向鏈表問題
不會。
實際上,SingleLinkedList只存儲了鏈表的表頭節點的位置。
每次調用add函數,相當於新建了一個節點,
調用setNext將其下一節點指向現在鏈表的表頭,
然後將新建的節點位置作為新的表頭位置保存在鏈表裡面。
要得到鏈表的所有節點必須從表頭節點開始一個一個往下跳轉,一直跳轉到下一節點位置為None,則表示查詢完畢。
8. python如何判斷一個鏈表是否為環狀
設置兩個指針,開始都指向鏈表頭,然後其中一個指針每次向前走一步,另一個指針每次向前走兩步,如果快的遇到NULL了,證明該鏈表中沒有環,如果有環,快的指針每次都要比慢的多走一步,最終兩個指針會相遇,(注意:這里快指針不會跳過慢指針而不相遇,因為它每次都只比慢指針多走一個單位) bool judge(list *head){if(head == NULL){return false;//沒有環} list *pFast = head; list *pSlow = head; while(pFast-next != NULL && pFast-next-next != NULL){pFast = pFast-next-next; pSlow = pSlow-next;
9. python數組和鏈表的區別
scores是數組所以scores[index]快,如果scores是鏈表的話要還要挨個遍歷所以scores[index]慢。
從這點來說你的理解是對的,鏈表找第幾個確實比數組找第幾個慢得多。因為鏈表要挨個遍歷,數組直接取偏移地址就好了。