python實現鏈表


鏈表

鏈表是計算機的一種數據結構,是一種物理存儲單元上非連續、非順序的存儲結構數據元素的邏輯順序是通過鏈表中的指針鏈接次序實現的。鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。

如上圖,一個簡單的單向鏈表。可見節點由數據和指針構成。

 

在python中沒有指針,我們要用引用來代替指針,下文用指針來說,但是在這不是指針,是引用。

1 class node():
2     def __init__(self,data=0,next=None):
3         self.data=data
4         self.next=next

如上圖,創建了節點

 

 

之后我們要讓節點連起來,組成鏈表

1 class linklist():
2     def __init__(self):
3         self.head=None
4         self.len=0

在鏈表中,頭結點很重要,一般會從頭結點開始遍歷鏈表

 

 

參考了一些其他的博客,總結得出,我們對鏈表主要有以下的操作:

1.在鏈表尾添加節點

2.在鏈表中插入節點

3.在鏈表中刪除節點

4.在鏈表中搜索節點

5.在鏈表中修改節點

6.遍歷輸出鏈表數據

 

1.在鏈表尾添加節點(和數組中append()函數作用相同)

思路:找到尾節點,讓尾結點next的指針為新節點

      如果鏈表為空,直接添加新節點

 1     def append_node(self,data):
 2         newnode=node(data,None)
 3         temp=self.head
 4         if self.head==None:
 5             self.head=newnode
 6         else :
 7             while temp.next!=None:
 8                 temp=temp.next
 9             temp.next=newnode
10             self.len+=1

2.在鏈表中插入節點

思路:新節點指向插入位置的節點,插入位置前一個節點指向新節點。如果插入到首位,只用執行前半句

 1     def insert(self,number,newdata):
 2         temp = self.head
 3         j = 0
 4         newnode=node(newdata)
 5         if self.len < number:
 6             print("error")
 7         else:
 8             while j < number-1:
 9                 temp = temp.next
10                 j += 1
11             newnode.next=temp.next
12             temp.next=newnode
13             self.len+=1

3.在鏈表中刪除節點

思路:讓刪除節點前節點指向刪除節點指向的節點,清除刪除節點所占用的內存。(在python中不會內存管理,第二句就不執行了)

 1     def del_node(self,number):#首項為0
 2         temp=self.head
 3         j=0
 4         if self.len<number:
 5             print("error")
 6         else:
 7             while j<number-1:
 8                 temp = temp.next
 9                 j+=1
10             temp.next=temp.next.next
11             self.len-=1

4.在鏈表中搜索節點

思路:從頭結點開始遍歷鏈表。

1     def search_node(self,data):
2         temp = self.head
3         j = 0
4         while temp.next!=None:
5             temp = temp.next
6             j += 1
7             if temp.data==data:
8                 break
9         return j

5.在鏈表中修改節點

思路:從頭結點開始遍歷鏈表,找到目標節點后修改其數據。

 1     def change_data(self,number,newdata):
 2         temp = self.head
 3         j = 0
 4         if self.len < number:
 5             print("error")
 6         else:
 7             while j < number:
 8                 temp = temp.next
 9                 j += 1
10             temp.data=newdata

6.遍歷輸出鏈表數據

思路:從頭結點開始遍歷鏈表並輸出數據。

1     def print_list(self):
2         temp=self.head
3         while temp.next!=None:
4             print(temp.data,"-> ",end="")
5             temp=temp.next
6         print(temp.data)

完整代碼,有需要請自取:

 1 class node():
 2     def __init__(self,data=0,next=None):
 3         self.data=data
 4         self.next=next
 5 
 6 class linklist():
 7     def __init__(self):
 8         self.head=None
 9         self.len=0
10 
11     def append_node(self,data):
12         newnode=node(data,None)
13         temp=self.head
14         if self.head==None:
15             self.head=newnode
16         else :
17             while temp.next!=None:
18                 temp=temp.next
19             temp.next=newnode
20             self.len+=1
21 
22     def print_list(self):
23         temp=self.head
24         while temp.next!=None:
25             print(temp.data,"-> ",end="")
26             temp=temp.next
27         print(temp.data)
28 
29     def del_node(self,number):#首項為0
30         temp=self.head
31         j=0
32         if self.len<number:
33             print("error")
34         else:
35             while j<number-1:
36                 temp = temp.next
37                 j+=1
38             temp.next=temp.next.next
39             self.len-=1
40 
41     def search_node(self,data):
42         temp = self.head
43         j = 0
44         while temp.next!=None:
45             temp = temp.next
46             j += 1
47             if temp.data==data:
48                 break
49         return j
50 
51     def change_data(self,number,newdata):
52         temp = self.head
53         j = 0
54         if self.len < number:
55             print("error")
56         else:
57             while j < number:
58                 temp = temp.next
59                 j += 1
60             temp.data=newdata
61 
62     def insert(self,number,newdata):
63         temp = self.head
64         j = 0
65         newnode=node(newdata)
66         if self.len < number:
67             print("error")
68         else:
69             while j < number-1:
70                 temp = temp.next
71                 j += 1
72             newnode.next=temp.next
73             temp.next=newnode
74             self.len+=1
75 
76 a=linklist()
77 for i in range (0,10):
78     a.append_node(i)
79 print("append_node:  ",end="")
80 a.print_list()
81 print("del_node(2):  ",end="")
82 a.del_node(2)
83 a.print_list()
84 print("search_node(5):  ",end="")
85 print(a.search_node(5))
86 print("change_data(4,999):  ",end="")
87 a.change_data(4,999)
88 a.print_list()
89 print("a.insert(4,19909)):  ",end="")
90 a.insert(4,19909)
91 a.print_list()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM