1. 程式人生 > 其它 >python實現連結串列

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()