python鏈表的基礎(chǔ)概念和基礎(chǔ)用法詳解
本文為大家分享了python鏈表的基礎(chǔ)概念和基礎(chǔ)用法,供大家參考,具體內(nèi)容如下
一、什么是鏈表
鏈表是由多個(gè)不同的節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)通過(guò)指針區(qū)域關(guān)聯(lián)到一起
鏈表的頭指針,指向了頭節(jié)點(diǎn),通過(guò)頭指針可以找到其他節(jié)點(diǎn)信息
二、什么是節(jié)點(diǎn)
鏈表由節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)又包含兩個(gè)部分,一個(gè)是元素區(qū)域,一個(gè)是指針區(qū)域。
元素區(qū)域存儲(chǔ)的是,當(dāng)前節(jié)點(diǎn)的數(shù)值,指針區(qū)域指向下一個(gè)節(jié)點(diǎn)的對(duì)象。在C語(yǔ)言中,指針應(yīng)該是指向下一個(gè)元素的的內(nèi)存地址,因python中不研究指針,這里用下一個(gè)節(jié)點(diǎn)的對(duì)象代替。這樣我們就能通過(guò)指針區(qū)域,找到下一個(gè)節(jié)點(diǎn)的信息,從而得到下一個(gè)節(jié)點(diǎn)的值了。
三、為什么引入鏈表的概念
1.先說(shuō)說(shuō)數(shù)組這種數(shù)據(jù)結(jié)構(gòu)吧,數(shù)組是一塊大的連續(xù)內(nèi)存空間。每次初始化需要開(kāi)辟一大塊內(nèi)存空間,空間利用率比較低。而鏈表則不同,鏈表的節(jié)點(diǎn)可以隨機(jī)分布在任何位置,只需通過(guò)指針穿引起來(lái)即可。
2.在連續(xù)的內(nèi)存空間中,插入一個(gè)元素時(shí),所有其他元素的位置也變動(dòng)了。插入元素、刪除元素時(shí)候,效率比較低。
鏈表是非連續(xù)的內(nèi)存空間,每個(gè)節(jié)點(diǎn)單獨(dú)存在自己的內(nèi)存空間,通過(guò)指針指向下一個(gè)節(jié)點(diǎn)。
如果在某個(gè)地方插入一個(gè)節(jié)點(diǎn),只需要改變指針的指向即可,不用其他元素都變動(dòng)。
四、鏈表的基本操作
# 實(shí)現(xiàn)頭部插入 尾部插入 根據(jù)索引插入 刪除節(jié)點(diǎn)并print 打印 # 定義一個(gè)節(jié)點(diǎn) class Node: ? ? def __init__(self, data): ? ? ? ? self.data = data ? ? ? ? self.next = None class SingleLinkList: ? ? def __init__(self): ? ? ? ? self.head = None ? ? ? ? self.tail = None ? ? def is_empty(self): ? ? ? ? """鏈表是否為空 ? ? ? ? :return: ? ? ? ? """ ? ? ? ? return self.head is None ? ? def length(self): ? ? ? ? """求當(dāng)前鏈表的長(zhǎng)度 ? ? ? ? :return: ? ? ? ? """ ? ? ? ? count = 0 ? ? ? ? cur = self.head ? ? ? ? while cur is not None: ? ? ? ? ? ? count += 1 ? ? ? ? ? ? cur = cur.next ? ? ? ? return count ? ? def insert_head_node(self, data): ? ? ? ? """鏈表頭部添加元素 ? ? ? ? :param data: 要保存的數(shù)據(jù) ? ? ? ? :return: ? ? ? ? """ ? ? ? ? node = Node(data) ? ? ? ? node.next = self.head ? ? ? ? self.head = node ? ? def append_node(self, data): ? ? ? ? """鏈表尾部添加元素,有多種實(shí)現(xiàn)方式 ? ? ? ? :param data: ? ? ? ? :return: ? ? ? ? """ ? ? ? ? # 第一種方式 ?時(shí)間復(fù)雜度為O(n)的處理方式 ? ? ? ? node = Node(data) ? ? ? ? # 如果鏈表為空,需要特殊處理 ? ? ? ? if self.is_empty(): ? ? ? ? ? ? self.head = node ? ? ? ? else: ? ? ? ? ? ? cur = self.head ? ? ? ? ? ? while cur.next is not None: ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? # 退出循環(huán)時(shí), cur指向尾節(jié)點(diǎn) ? ? ? ? ? ? cur.next = node ? ? ? ? # 第二種 引入一個(gè)tail指針 默認(rèn)當(dāng)前鏈表為一個(gè)空鏈表,不停的去append節(jié)點(diǎn) ? ? ? ? # node = Node(data) ? ? ? ? # if self.is_empty(): ?# 當(dāng)?shù)谝淮翁砑庸?jié)點(diǎn)到空鏈表中的時(shí)候,頭指針和尾指針同時(shí)指向新節(jié)點(diǎn) ? ? ? ? # ? ? self.head = node ? ? ? ? # ? ? self.tail = node ? ? ? ? # else: ? ? ? ? # 當(dāng)再次添加節(jié)點(diǎn)到鏈表中的時(shí)候, 頭指針始終指向頭節(jié)點(diǎn),尾指針始終執(zhí)行未節(jié)點(diǎn),如果一直向未節(jié)點(diǎn)追加節(jié)點(diǎn),只需移動(dòng)tail指針即可 ? ? ? ? # ? ? self.tail.next = node ? ? ? ? # ? ? self.tail = node ? ? def insert_node(self, pos, data): ? ? ? ? """指定位置添加元素 ? ? ? ? :param pos: ? ? ? ? :param data: ? ? ? ? :return: ? ? ? ? """ ? ? ? ? # 1, 在頭部添加 ? ? ? ? if pos <= 0: ? ? ? ? ? ? self.insert_head_node(data) ? ? ? ? # 2, 在尾部添加 ? ? ? ? elif self.length() >= pos: ? ? ? ? ? ? self.append_node(data) ? ? ? ? # 3, 指定位置添加 ? ? ? ? else: ? ? ? ? ? ? count = 0 ? ? ? ? ? ? while count < (pos - 2): ? ? ? ? ? ? ? ? count += 1 ? ? ? ? ? ? ? ? self.head = self.head.next ? ? ? ? ? ? # 這時(shí)候self.head 表示當(dāng)前插入前一個(gè)節(jié)點(diǎn) ? ? ? ? ? ? # self.head.next 表示當(dāng)前插入的后一個(gè)節(jié)點(diǎn) ? ? ? ? ? ? node = Node(data) ? ? ? ? ? ? self.head.next = node ? ? ? ? ? ? node.next = self.head.next ? ? def delete_node(self, data): ? ? ? ? """刪除節(jié)點(diǎn) ? ? ? ? :param data: ? ? ? ? :return: ? ? ? ? """ ? ? ? ? cur = self.head ? ? # 記錄當(dāng)前節(jié)點(diǎn)的位置 ? ? ? ? pre = None ? ? ? ? ?# 記錄當(dāng)前節(jié)點(diǎn)位置的前置節(jié)點(diǎn) ? ? ? ? while cur is not None: ? ? ? ? ? ? # 找到了要?jiǎng)h除的元素 ? ? ? ? ? ? if cur.data == data: ? ? ? ? ? ? ? ? # 在頭部找到了要?jiǎng)h除的元素 ? ? ? ? ? ? ? ? if cur == self.head: ? ? ? ? ? ? ? ? ? ? self.head = cur.next ? ? ? ? ? ? ? ? ? ? return True ? ? ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? ? ? pre.next = cur.next ? ? ? ? ? ? ? ? ? ? return True ? ? ? ? ? ? else: ? ? ? ? ? ? ? ? # 不是要找的元素, 移動(dòng)光標(biāo) ? ? ? ? ? ? ? ? pre = cur ? ? ? ? ? ? ? ? cur = cur.next ? ? def search_node(self, data): ? ? ? ? """查找節(jié)點(diǎn)是否存在 ? ? ? ? :return: ? ? ? ? """ ? ? ? ? cur = self.head ? ? ? ? while cur is not None: ? ? ? ? ? ? if cur.data == data: ? ? ? ? ? ? ? ? return True ? ? ? ? ? ? cur = cur.next ? ? ? ? return False ? ? def reveres_node(self): ? ? ? ? """鏈表反轉(zhuǎn) ? ? ? ? :return: ? ? ? ? """ ? ? ? ? if self.is_empty(): ? ? ? ? ? ? return ? ? ? ? j = 0 ? ? ? ? while j < self.length() - 1: ? ? ? ? ? ? cur = self.head ? ? ? ? ? ? for i in range(self.length() - 1): ? ? ? ? ? ? ? ? cur = cur.next ? ? ? ? ? ? ? ? if cur.next is None: ? ? ? ? ? ? ? ? ? ? x = cur.data ? ? ? ? ? ? ? ? ? ? self.delete_node(cur.data) ? ? ? ? ? ? ? ? ? ? self.insert_node(j, x) ? ? ? ? ? ? j += 1 ? ? ? ? return self.head
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
pytorch之torch.nn.Identity()的作用及解釋
這篇文章主要介紹了pytorch之torch.nn.Identity()的作用及解釋,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Python2和3字符編碼的區(qū)別知識(shí)點(diǎn)整理
在本篇文章中小編給各位分享的是關(guān)于Python2和3字符編碼的區(qū)別知識(shí)點(diǎn),有需要的朋友們可以學(xué)習(xí)下。2019-08-08拓?fù)渑判騊ython實(shí)現(xiàn)的過(guò)程
這篇文章主要介紹了拓?fù)渑判騊ython實(shí)現(xiàn)的過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01Python使用re模塊實(shí)現(xiàn)信息篩選的方法
這篇文章主要介紹了Python使用re模塊實(shí)現(xiàn)信息篩選的方法,結(jié)合實(shí)例形式分析了Python正則re模塊進(jìn)行信息篩選操作的相關(guān)實(shí)現(xiàn)技巧及相關(guān)函數(shù)使用技巧,需要的朋友可以參考下2018-04-04將tensorflow.Variable中的某些元素取出組成一個(gè)新的矩陣示例
今天小編就為大家分享一篇將tensorflow.Variable中的某些元素取出組成一個(gè)新的矩陣示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01CentOS安裝pillow報(bào)錯(cuò)的解決方法
本文給大家分享的是作者在centos下為Python安裝pillow的時(shí)候報(bào)錯(cuò)的解決方法,希望對(duì)大家能夠有所幫助。2016-01-01Python使用openpyxl讀寫(xiě)excel文件的方法
本篇文章主要介紹了Python使用openpyxl讀寫(xiě)excel文件的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06