<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
線性表是一種線性結構,它是由零個或多個資料元素構成的有限序列。線性表的特徵是在一個序列中,除了頭尾元素,每個元素都有且只有一個直接前驅,有且只有一個直接後繼,而序列頭元素沒有直接前驅,序列尾元素沒有直接後繼。
資料結構中常見的線性結構有陣列、單連結串列、雙連結串列、迴圈連結串列等。線性表中的元素為某種相同的抽象資料型別。可以是C語言的內建型別或結構體,也可以是C++自定義型別。
陣列在實際的實體記憶體上也是連續儲存的,陣列有上界和下界。C語言中定義一個陣列:
陣列下標是從0開始的,a[0]對應第一個元素。其中,a[0]稱為陣列a的下界,a[6]稱為陣列a的上屆。超過這個範圍的下標使用陣列,將造成陣列越界錯誤。
陣列的特點是:資料連續,支援快速隨機存取。
陣列分為固定陣列與動態陣列。其中固定陣列的大小必須在編譯時就能夠確認,動態陣列允許在執行時申請陣列記憶體。複雜點的陣列是多維陣列,多維陣列實際上也是通過一維陣列來實現的。在C語言中,可以通過malloc來分配動態陣列,C++使用new。另外,C++的標準模板庫提供了動態陣列型別vector以及內建有固定陣列型別array。
Python中list可以被認為是封裝好的陣列。
單向連結串列是連結串列的一種。連結串列由節點所構成,節點內含一個指向下一個節點的指標,節點依次連結成為連結串列。因此,連結串列這種資料結構通常在實體記憶體上是不連續的。連結串列的通常含有一個頭節點,頭節點不存放實際的值,它含有一個指標,指向存放元素的第一個節點。
class Node(): """ 單連結串列中的節點應該具有兩個屬性:val 和 next。 val 是當前節點的值, next 是指向下一個節點的指標/參照。 """ def __init__(self, value): # 存放元素資料 self.val = value # next是下一個節點的標識 self.next = None
您可以選擇使用單連結串列或雙連結串列。單連結串列中的節點應該具有兩個屬性:val
和 next
。val
是當前節點的值,next
是指向下一個節點的指標/參照。如果要使用雙向連結串列,則還需要一個屬性 prev
以指示連結串列中的上一個節點。假設連結串列中的所有節點都是 0-index 的。
在連結串列類中實現這些功能:
index
個節點的值。如果索引無效,則返回-1
。val
的節點。插入後,新節點將成為連結串列的第一個節點。val
的節點追加到連結串列的最後一個元素。index
個節點之前新增值為 val
的節點。如果 index
等於連結串列的長度,則該節點將附加到連結串列的末尾。如果 index
大於連結串列長度,則不會插入節點。index
有效,則刪除連結串列中的第 index
個節點。#!/usr/bin/env python # -*- coding: utf-8 -*- """ @Author : Young @File : linked_list2.py @version : 1.0 @Time : 2019/4/5 11:06 Description about this file: """ class Node(): """ 單連結串列中的節點應該具有兩個屬性:val 和 next。 val 是當前節點的值, next 是指向下一個節點的指標/參照。 """ def __init__(self, value): # 存放元素資料 self.val = value # next是下一個節點的標識 self.next = None class SingleLinkList(): def __init__(self, node=None): # 頭節點定義為私有變數 self._head = node def is_empty(self): # 判斷連結串列是否為空 if self._head is None: return True else: return False def get(self, index: int) -> int: """ 獲取連結串列中第 index 個節點的值。如果索引無效,則返回-1 :param index: 索引值 :return: """ if self._head is None: return -1 cur = self._head for i in range(index): if cur.next is None: return -1 cur = cur.next return cur.val def length(self): """ cur遊標,用來移動遍歷節點 count用來計數 :return: 返回連結串列的長度 """ cur = self._head count = 0 while cur is not None: count += 1 cur = cur.next return count def travel(self): """ 遍歷整個連結串列 :return: """ cur = self._head while cur is not None: print(cur.elem, end=' ') cur = cur.next def add_at_head(self, val: int) -> None: """ 在頭部新增一個節點 :param val: :return: None """ # 先建立一個儲存item值的節點 node = Node(val) # 判斷連結串列是否為空 if self._head is None: self._head = node else: # 將新節點的連結域next指向頭節點,即_head指向的位置 node.next = self._head # 將連結串列的頭_head指向新節點 self._head = node def add_at_tail(self, val: int) -> None or int: """ 在尾部新增一個節點 :param item: :return: """ node = Node(val) # 若連結串列為空,直接將該節點作為連結串列的第一個元素 if self._head is None: self._head = node else: cur = self._head while cur.next is not None: cur = cur.next cur.next = node def add_at_index(self, index: int, val: int) -> None: """ 在指定位置pos新增節點 pos從0開始 :param index: :param val: :return: """ # 若指定位置pos為第一個元素之前,則執行頭部插入 if index <= 0: self.add_at_head(val) # 若指定位置超過連結串列尾部,則執行尾部插入 elif index >= self.length(): self.add_at_tail(val) # 找到指定位置 else: # pre用來指向指定位置pos的前一個位置pos-1,初始從頭節點開始移動到指定位置 pre = self._head count = 0 node = Node(val) # 在目標節點的前一位停下 while count < (index - 1): count += 1 pre = pre.next # 先將新節點node的next指向插入位置的節點 node.next = pre.next # 將插入位置的前一個節點的next指向新節點 pre.next = node def delete_at_index(self, index: int) -> None or int: """ 如果索引 index 有效,則刪除連結串列中的第 index 個節點。 :param index: 對應的索引值 :return: -1表示為異常 """ pre = None cur = self._head if index is 0: self._head = None for i in range(index): if cur.next is None: # raise IndexError("越界") return -1 pre = cur cur = pre.next else: pre.next = cur.next def search(self, val: int) -> True or False: """ 查詢節點是否存在 :param val: 節點的val值 :return: """ cur = self._head while cur is not None: if cur.val == val: return True else: cur = cur.next return False if __name__ == '__main__': obj = SingleLinkList() obj.add_at_head(1) obj.add_at_tail(3) obj.add_at_index(1, 2) obj.travel() obj.delete_at_index(1) obj.travel()
連結串列失去了順序表隨機讀取的優點,同時連結串列由於增加了結點的指標域,空間開銷比較大,但對儲存空間的使用要相對靈活。
連結串列與順序表的各種操作複雜度如下所示:
操作 | 連結串列 | 順序表 |
存取元素 | O(n) | O(1) |
在頭部插入/刪除 | O(1) | O(n) |
在尾部插入/刪除 | O(n) | O(1) |
在中間插入/刪除 | O(n) | O(n) |
到此這篇關於Python線性表種的單連結串列詳解的文章就介紹到這了,更多相關Python單連結串列內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45