日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python数据结构学习笔记——链表:无序链表和有序链表

發布時間:2024/2/28 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python数据结构学习笔记——链表:无序链表和有序链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 一、鏈表
  • 二、無序鏈表 實現步驟分析
  • 三、無序鏈表的Python實現代碼
  • 四、有序鏈表 實現步驟分析
  • 五、有序鏈表的Python實現代碼
  • 結語

一、鏈表


鏈表中每一個元素都由為兩部分構成:一是該鏈表節點的數據,二是指向下一個節點的引用。
1、定義節點類,鏈表中的節點包含數據以及指向下一個節點的引用,在構造方法中定義一個變量data用于存儲數據,另定義一個變量next等于None,即指向None的引用,代表傳入的節點后面沒有元素(由于不確定傳入的元素數目),使其指向一個空值;

# 節點類 class Node:def __init__(self, initdata):self.data = initdataself.next = None # 指向空值,初始化next

2、返回當前指向節點的數據

def getData(self):return self.data # 返回當前數據,無需參數

3、返回當前指向節點指向下一個節點的引用

def getNext(self):return self.next # 返回當前指向下一個節點的引用,無需參數

4、傳入新的節點數據

def setData(self, newdata):self.data = newdata # 添加新的數據,包含參數newdata

5、傳入指向下一個節點的引用

def setNext(self, newnext):self.next = newnext # 添加新的指向引用,包含參數newnext

通過向鏈表中添加節點數據以及指向和傳入節點的引用來測試,完整代碼如下:

# 節點類 class Node:def __init__(self, initdata):self.data = initdataself.next = None # 指向空值,初始化nextdef getData(self):return self.data # 返回當前數據,無需參數def getNext(self):return self.next # 返回當前指向下一個節點的引用,無需參數def setData(self, newdata):self.data = newdata # 添加新的數據,包含參數newdatadef setNext(self, newnext):self.next = newnext # 添加新的指向引用,包含參數newnextc = Node(2) # 向鏈表中傳入節點數據"2" print(c.getData()) # 獲取當前指向節點的數據 print(c.getNext()) # 返回當前指向節點指向下一個節點的引用,由于初始化指向引用為None,所以為None c.setData(36) # 傳入新的節點數據"36" print(c.getData()) # 獲取當前指向節點的數據 c.setData("st") c.setNext("st") # 傳入指向下一個節點的引用為st print(c.getNext()) print(c.getData())

運行結果如下:

二、無序鏈表 實現步驟分析

通過定義一個無序列表UnorderedList類,然后基于鏈表Node類的方法實現無序鏈表,無序列表本身不包含鏈表中的任何節點,只是其頭部指向整個鏈表結構中第一個節點的引用,該節點包含指向下一個節點的引用。
1、定義無序列表類,head指向None,它表示無序列表的頭部沒有指向任何節點,即說明這是一個空列表。

# 無序列表類 class UnorderedList:def __init__(self):self.head = None # 表示無序列表的頭部沒有指向任何節點

2、檢查列表是否為空,通過比較運算符“==”比較隊列是否為空(None),若為空,則返回布爾值False,若不為空,則返回True;

def isEmpty(self): # 檢查無序列表是否為空,不需要參數,返回一個布爾值return self.head == None

3、向列表中添加元素,通過節點類Node()的構造方法添加新元素temp,然后利用節點類的setNext()方法傳入新的指向引用,即指向鏈表的頭部,此時再將新元素賦值給鏈表的頭部;

def add(self, item): # 向列表中添加元素temp = Node(item) # 添加新元素temptemp.setNext(self.head) # 傳入新的指向引用,指向鏈表的頭部 self.head = temp # 將新元素賦值給鏈表的頭部

4、返回列表中元素數目,首先初始化變量current將列表的頭節點賦值給它,然后對列表進行遍歷;

def length(self): # 返回列表中元素數目current = self.head # 定義中間變量current,列表的頭節點賦值給該變量count = 0while current != None: # 列表遍歷count = count + 1 # 每當指向一個節點,變量count遞加1current = current.getNext() # 返回當前指向下一個節點的引用并賦值給變量currentreturn count

5、搜索指定的列表元素,通過輸入參數item搜索,遍歷列表,found作為一個布爾值,初值為False,若定義的中間變量current的數據等于要搜索的元素時,則說明已搜索到該元素,并將布爾值True賦值給變量found,改變其值然后返回True值;

def search(self, item): # 在列表中搜索元素item,需參數itemcurrent = self.head # 定義中間變量current,列表的頭節點賦值給該變量found = Falsewhile current != None and not found:if current.geatData() == item: # 若定義的中間變量的數據等于要搜索的元素時,則將布爾值True賦值給變量found,改變其值found = Trueelse: # 若不是要搜索的元素,即對下一個節點進行搜索current = current.getNext() # 返回當前指向下一個節點的引用并賦值給變量currentreturn found

6、刪除指定的列表元素,刪除操作的第一步也是先搜索要要刪除的元素;

def remove(self, item): # 從列表中刪除元素item,需參數itemcurrent = self.head # 定義中間變量current,列表的頭節點賦值給該變量,標記當前位置previous = None # 定義變量previous為空found = Falsewhile not found: # 若定義的found變量布爾值為True時,while循環一直執行下去if current.getData() == item:found = Trueelse: # 若found變量布爾值改變,執行以下操作previous = current # 將列表的頭節點賦值給該變量previouscurrent = current.getNext() # 返回當前指向下一個節點的引用并賦值給變量currentif previous == None: # 若要刪除的元素是列表中的頭節點時,需改變列表的頭節點self.head = current.getNext() # 返回當前指向下一個節點的引用并賦值給列表的頭節點else:previous.setNext(current.getNext()) # 使用previous的setNext方法來完成移除操作,添加新的指向引用,修改后的引用都指向當前指向下一個節點的引用

三、無序鏈表的Python實現代碼

完整代碼及測試如下:

# 節點類 class Node:def __init__(self, initdata):self.data = initdataself.next = None # 指向空值,初始化nextdef getData(self):return self.data # 返回當前數據,無需參數def getNext(self):return self.next # 返回當前指向下一個節點的引用,無需參數def setData(self, newdata):self.data = newdata # 添加新的數據,包含參數newdatadef setNext(self, newnext):self.next = newnext # 添加新的指向引用,包含參數newnext# 無序列表類 class UnorderedList:def __init__(self):self.head = None # 表示無序列表的頭部沒有指向任何節點def isEmpty(self): # 檢查無序列表是否為空,不需要參數,返回一個布爾值return self.head == Nonedef add(self, item): # 向列表中添加元素temp = Node(item) # 通過節點類Node()的構造方法添加新元素temptemp.setNext(self.head) # 通過節點類的setNext()方法傳入新的指向引用,指向鏈表的頭部self.head = temp # 將新元素賦值給鏈表的頭部def length(self): # 返回列表中元素數目current = self.head # 定義中間變量current,列表的頭節點賦值給該變量,標記當前位置count = 0while current != None: # 列表遍歷count = count + 1 # 每當指向一個節點,變量count遞加1current = current.getNext() # 返回當前指向下一個節點的引用并賦值給變量currentreturn countdef search(self, item): # 在列表中搜索元素item,需參數itemcurrent = self.head # 定義中間變量current,列表的頭節點賦值給該變量,標記當前位置found = Falsewhile current != None and not found:if current.getData() == item: # 若定義的中間變量的數據等于要搜索的元素時,則將布爾值True賦值給變量found,改變其值found = Trueelse: # 若不是要搜索的元素,即對下一個節點進行搜索current = current.getNext() # 返回當前指向下一個節點的引用并賦值給變量currentreturn founddef remove(self, item): # 從列表中刪除元素item,需參數itemcurrent = self.head # 定義中間變量current,列表的頭節點賦值給該變量,標記當前位置previous = None # 定義變量previous為空found = Falsewhile not found: # 若定義的found變量布爾值為True時,while循環一直執行下去if current.getData() == item:found = Trueelse: # 若found變量布爾值改變,執行以下操作previous = current # 將列表的頭節點賦值給該變量previouscurrent = current.getNext() # 返回當前指向下一個節點的引用并賦值給變量currentif previous == None: # 若要刪除的元素是列表中的頭節點時,需改變列表的頭節點self.head = current.getNext() # 返回當前指向下一個節點的引用并賦值給列表的頭節點else:previous.setNext(current.getNext()) # 使用previous的setNext方法來完成移除操作,添加新的指向引用,修改后的引用都指向當前指向下一個節點的引用# 測試 mylist = UnorderedList() # 創建一個無序鏈表 print(mylist.isEmpty()) # 檢查鏈表是否為空 mylist.add(39) mylist.add(154) mylist.add("trr") mylist.add(10) print(mylist.isEmpty()) print(mylist.length()) # 返回列表的元素數目 print(mylist.search(21)) print(mylist.search("trr")) mylist.remove(39) print(mylist.length()) print(mylist.search(39))

運行結果如下:

四、有序鏈表 實現步驟分析

通過定義一個有序列表OrderedList類,然后基于鏈表Node類的方法實現有序鏈表,有序列表為升序排列或降序排列,它的一些操作基本與無序列表相同,只是search搜索元素和add添加元素要需要根據其修改。
1、定義有序列表類,與有序列表一樣,也是head引用指向None,代表它是一個空列表;

# 無序列表類 class OrderedList:def __init__(self):self.head = None # 表示無序列表的頭部沒有指向任何節點

2、檢查列表是否為空,通過比較運算符“==”比較隊列是否為空(None),若為空,則返回布爾值False,若不為空,則返回True;

def isEmpty(self): # 檢查無序列表是否為空,不需要參數,返回一個布爾值return self.head == None

3、向列表中添加元素,首先確定位置然后條件元素;

def add(self, item): # 向列表中添加元素current = self.head # 定義中間變量current,列表的頭節點賦值給該變量,標記當前位置previous = None # 定義變量previous值為空stop = Falsewhile current != None and not stop: # 變量previous值跟在變量current后面,只要還有節點且不大于要添加的元素while循環一直進行下去if current.getData() > item:stop = Trueelse:previous = currentcurrent = current.getNext()temp = Node(item) # 通過節點類Node()的構造方法添加新元素tempif previous == None: # 判斷添加的元素添加到鏈表的開頭還是中間某個位置temp.setNext(self.head) # 通過節點類的setNext()方法傳入新的指向引用,指向鏈表的頭部self.head = temp # 將新元素賦值給鏈表的頭部else:temp.setNext(current)previous.setNext(temp)

4、返回列表中元素數目,首先初始化變量current將列表的頭節點賦值給它,然后對列表進行遍歷;

def length(self): # 返回列表中元素數目current = self.head # 定義中間變量current,列表的頭節點賦值給該變量count = 0while current != None: # 列表遍歷count = count + 1 # 每當指向一個節點,變量count遞加1current = current.getNext() # 返回當前指向下一個節點的引用并賦值給變量currentreturn count

5、搜索指定的列表元素,通過輸入參數item搜索,遍歷列表,found作為一個布爾值,初值為False,若定義的中間變量current的數據等于要搜索的元素時,則說明已搜索到該元素,并將布爾值True賦值給變量found,改變其值然后返回True值,若不是要搜索的元素,即對下一個節點進行搜索,遇到中間值大于目標元素的節點,則將stop值設為True,否則將中間變量的指向下一個節點的引用賦值給current,然后繼續進行while循環;

def search(self, item): # 在列表中搜索元素item,需參數itemcurrent = self.head # 定義中間變量current,列表的頭節點賦值給該變量,標記當前位置found = Falsestop = Falsewhile current != None and not found and not stop:if current.getData() == item: # 若定義的中間變量的數據等于要搜索的元素時,則將布爾值True賦值給變量found,改變其值found = Trueelse: # 若不是要搜索的元素,即對下一個節點進行搜索if current.getData() > item: # 若遇到中間值大于目標元素的節點,則將stop值設為Truestop = Trueelse:current = current.getNext() # 否則返回當前指向下一個節點的引用并賦值給變量currentreturn found

6、刪除指定的列表元素,刪除操作的第一步也是先搜索要要刪除的元素;

def remove(self, item): # 從列表中刪除元素item,需參數itemcurrent = self.head # 定義中間變量current,列表的頭節點賦值給該變量,標記當前位置previous = None # 定義變量previous為空found = Falsewhile not found: # 若定義的found變量布爾值為True時,while循環一直執行下去if current.getData() == item:found = Trueelse: # 若found變量布爾值改變,執行以下操作previous = current # 將列表的頭節點賦值給該變量previouscurrent = current.getNext() # 返回當前指向下一個節點的引用并賦值給變量currentif previous == None: # 若要刪除的元素是列表中的頭節點時,需改變列表的頭節點self.head = current.getNext() # 返回當前指向下一個節點的引用并賦值給列表的頭節點else:previous.setNext(current.getNext()) # 使用previous的setNext方法來完成移除操作,添加新的指向引用,修改后的引用都指向當前指向下一個節點的引用

五、有序鏈表的Python實現代碼

完整代碼及測試如下:

# 節點類 class Node:def __init__(self, initdata):self.data = initdataself.next = None # 指向空值,初始化nextdef getData(self):return self.data # 返回當前數據,無需參數def getNext(self):return self.next # 返回當前指向下一個節點的引用,無需參數def setData(self, newdata):self.data = newdata # 添加新的數據,包含參數newdatadef setNext(self, newnext):self.next = newnext # 添加新的指向引用,包含參數newnext# 無序列表類 class OrderedList:def __init__(self):self.head = None # 表示無序列表的頭部沒有指向任何節點def isEmpty(self): # 檢查無序列表是否為空,不需要參數,返回一個布爾值return self.head == Nonedef add(self, item): # 向列表中添加元素current = self.head # 定義中間變量current,列表的頭節點賦值給該變量,標記當前位置previous = None # 定義變量previous值為空stop = Falsewhile current != None and not stop: # 變量previous值跟在變量current后面,只要還有節點且不大于要添加的元素while循環一直進行下去if current.getData() > item:stop = Trueelse:previous = currentcurrent = current.getNext()temp = Node(item) # 通過節點類Node()的構造方法添加新元素tempif previous == None: # 判斷添加的元素添加到鏈表的開頭還是中間某個位置temp.setNext(self.head) # 通過節點類的setNext()方法傳入新的指向引用,指向鏈表的頭部self.head = temp # 將新元素賦值給鏈表的頭部else:temp.setNext(current)previous.setNext(temp)def length(self): # 返回列表中元素數目current = self.head # 定義中間變量current,列表的頭節點賦值給該變量,標記當前位置count = 0while current != None: # 列表遍歷count = count + 1 # 每當指向一個節點,變量count遞加1current = current.getNext() # 返回當前指向下一個節點的引用并賦值給變量currentreturn countdef search(self, item): # 在列表中搜索元素item,需參數itemcurrent = self.head # 定義中間變量current,列表的頭節點賦值給該變量,標記當前位置found = Falsestop = Falsewhile current != None and not found and not stop:if current.getData() == item: # 若定義的中間變量的數據等于要搜索的元素時,則將布爾值True賦值給變量found,改變其值found = Trueelse: # 若不是要搜索的元素,即對下一個節點進行搜索if current.getData() > item: # 若遇到中間值大于目標元素的節點,則將stop值設為Truestop = Trueelse:current = current.getNext() # 否則返回當前指向下一個節點的引用并賦值給變量currentreturn founddef remove(self, item): # 從列表中刪除元素item,需參數itemcurrent = self.head # 定義中間變量current,列表的頭節點賦值給該變量,標記當前位置previous = None # 定義變量previous值為空found = Falsewhile not found: # 若定義的found變量布爾值為True時,while循環一直執行下去if current.getData() == item:found = Trueelse: # 若found變量布爾值改變,執行以下操作previous = current # 將列表的頭節點賦值給該變量previouscurrent = current.getNext() # 返回當前指向下一個節點的引用并賦值給變量currentif previous == None: # 若要刪除的元素是列表中的頭節點時,需改變列表的頭節點self.head = current.getNext() # 返回當前指向下一個節點的引用并賦值給列表的頭節點else:previous.setNext(current.getNext()) # 使用previous的setNext方法來完成移除操作,添加新的指向引用,修改后的引用都指向當前指向下一個節點的引用# 測試 mylist = OrderedList() # 創建一個有序鏈表 print(mylist.isEmpty()) # 檢查鏈表是否為空 mylist.add(39) # 添加元素 mylist.add(154) mylist.add(10) print(mylist.isEmpty()) print(mylist.length()) # 返回列表的元素數目 print(mylist.search(21)) mylist.remove(39) # 移除元素39 print(mylist.length()) print(mylist.search(39))

運行結果如下:

結語

參考書籍:《Python數據結構與算法分析 第2版》 [美] 布拉德利·米勒(Bradley N. Miller)
戴維·拉努姆(DavidL. Ranum)|譯者:呂能 刁壽鈞

以上就是本次Python數據結構學習筆記——鏈表的全部內容,篇幅較長,感謝您的閱讀和支持,若有表述或代碼中有不當之處,望指出!您的指出和建議能給博主帶來很大的動力!!!

總結

以上是生活随笔為你收集整理的Python数据结构学习笔记——链表:无序链表和有序链表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。