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