1. 程式人生 > >python 實現單向連結串列

python 實現單向連結串列

1.連結串列Linked list

連結串列(Linked list)是一種常見的基礎資料結構,是一種線性表,但是不像順序表一樣連續儲存資料,而是在每一個節點(資料儲存單元)裡存放下一個節點的位置資訊(即地址)。

連結串列一個節點包含資料儲存單元和下一個節點的位置資訊單元

2.連結串列和順序表的區別

2.1 順序表

  • 構建需要預先知道資料大小來申請連續的儲存空間,而在進行擴充時又需要進行資料的搬遷,所以使用起來並不是很靈活。
  • 順序表隨機讀取資料比較快

2.2 連結串列

  • 連結串列結構可以充分利用計算機記憶體空間,實現靈活的記憶體動態管理。
  • 由於增加節點的指標域,空間開銷比較大

3.連結串列和列表的區別

  • 連結串列是非順序表, 而列表是順序表

  • 連結串列插入資料的時候,會比列表快很多

  • 查詢資料的時候列表卻更為優勢

4.單向連結串列的特性

單向連結串列也叫單鏈表,是連結串列中最簡單的一種形式,它的每個節點包含兩個域,一個資訊域(元素域)和一個連結域。

這個連結指向連結串列中的下一個節點,而最後一個節點的連結域則指向一個空值

5.實現單向連結串列的python程式碼

5.1 單鏈表的操作

is_empty() 連結串列是否為空
length() 連結串列長度
travel() 遍歷整個連結串列
add(item) 連結串列頭部新增元素
append(item) 連結串列尾部新增元素
insert(pos, item) 指定位置新增元素
remove(item) 刪除節點
search(item) 查詢節點是否存在

5.2 單鏈表的程式碼實現

""""單向連結"""""

class Node(object):
    # 節點類
    def __init__(self,item):
        self.item = item  # 記錄存放資料
        self.next = None  # 記錄下一個節點


class SingleLinkList(object):
    # 單鏈表類
    def __init__(self):
        # 所有操作都是從頭開始,需要記錄頭結點
        self.__head = None

    def is_empty
(self): """連結串列是否為空""" return self.__head is None def length(self): """連結串列長度""" # 定義計數器,遍歷連結串列 count = 0 cur = self.__head while cur is not None: count += 1 cur = cur.next return count def travel(self): """遍歷整個連結串列""" # 定義遊標,從頭向尾移動 cur = self.__head while cur is not None: print(cur.item,end="") cur = cur.next print() def add(self,item): """連結串列頭部新增元素""" # 建立新的節點 node = Node(item) # 讓新節點的next 指向原來的頭結點 node.next = self.__head # 讓head指向新節點 self.__head = node def append(self,item): """"連結串列尾部新增元素""" # 判斷連結串列是否為空, 不為空就是false if self.is_empty(): # 如果為空,則直接按照add從頭新增的方式新增元素,否則連結串列有元素,就直接按照末尾的狀態新增 self.add(item) return # 第一步,找尾節點 cur = self.__head while cur.next is not None: # 第二步,尾節點指向新節點 cur = cur.next # while 迴圈結束,cur指向尾節點 # 第二步,尾節點指向新節點\ node = Node(item) cur.next = node def insert(self,pos, item): """指定位置新增元素""" # 保證程式碼的健壯性 if pos < 0: # 前面新增 self.add(item) elif pos >= (self.length()-1): # 尾部新增 self.append(item) else: # 1 定義下標,與遊標同步變化 index = 0 cur = self.__head while index < pos -1: index += 1 cur = cur.next # 迴圈結束後,cur指向pos前置節點- node = Node(item) # 2 讓新節點的next 指向pos位置節點 node.next = cur.next # 3. 讓pos位置的前置節點指向新節點 cur.next = node def remove(self,item): """刪除節點""" # 記錄當前節點的前置節點 pre = None # cur前置節點 cur =self.__head while cur is not None: if cur.item == item: # 刪除節點 # 如果pre為空,證明刪除的是頭節點 if pre is None: self.__head = cur.next else: pre.next = cur.next return # pre 一直記錄cur的前置節點 pre = cur cur = cur.next def search(self,item): """查詢節點是否存在""" cur = self.__head while cur is not None: if cur.item == item: return True cur = cur.next return False if __name__ == '__main__': sll = SingleLinkList() print(sll.length()) print(sll.is_empty()) sll.add(3) print(sll.is_empty()) sll.add(2) sll.add(1) sll.travel() print(sll.length()) sll.append(4) sll.travel() sll.insert(2, 6) sll.travel() sll.insert(-10, 7) sll.travel() sll.insert(10, 5) sll.travel() sll.remove(3) sll.travel() sll.remove(7) sll.travel() sll.remove(5) sll.travel() print(sll.search(1)) print(sll.search(6)) print(sll.search(4)) print(sll.search(5))

6.連結串列和順序表操作複雜度對比

操作 連結串列 順序表
訪問元素 O(n) O(1)
在頭部插入/刪除 O(1) O(n)
在尾部插入/刪除 O(n) O(1)
在中間插入/刪除 O(n) O(n)

注意雖然表面看起來複雜度都是 O(n),但是連結串列和順序表在插入和刪除時進行的是完全不同的操作。

  • 連結串列的主要耗時操作是遍歷查詢,刪除和插入操作本身的複雜度是O(1)。

  • 順序表查詢很快,主要耗時的操作是拷貝覆蓋

因為除了目標元素在尾部的特殊情況,順序表進行插入和刪除時需要對操作點之後的所有元素進行前後移位操作,只能通過拷貝和覆蓋的方法進行。

以上內容僅是代表個人總結 若有錯誤之處,還請批評指正,歡迎大家一起學習!

相關推薦

python 實現單向連結串列

1.連結串列Linked list 連結串列(Linked list)是一種常見的基礎資料結構,是一種線性表,但是不像順序表一樣連續儲存資料,而是在每一個節點(資料儲存單元)裡存放下一個節點的位置資訊(即地址)。 連結串列一個節點包含資料儲存單元和下一個節點的位

python實現單向連結串列

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 5

python實現單向連結串列

在C語言中,用指標來實現單向連結串列非常簡單。而python是不存在指標這種結構的,但我們也可以實現連結串列資料結構,使用類和物件的引用即可達到C語言中的指標的效果。 圖片來自於網路 圖中我們可以看到,單向連結串列的每一個節點會包含兩項資料,當前節點的元

Python 實現單向連結串列

寫在前面 最近在看資料結構,看過才發現,只有這些東西才能讓我更加深刻的理解 python 中的資料型別。其實不管語言怎麼變化,資料結構和演算法是恆古不變的,這些東西學會,學一些別的語言會很快的。 我可能太菜了,一個連結串列看了好幾遍,手動捂臉,。 什麼是 連結串

c實現功能(13)實現單向連結串列的簡要功能

#include <stdio.h> #include <stdlib.h> //利用結構體建立節點 struct list{ //建立資料域 int data; //建立指標域 struct list *next; }; //實現建立一個

Python實現雙向連結串列

直接看程式碼,有註解 class Node(object): """結點""" def __init__(self, item): self.elem = item self.next = None self.prev =

Python實現"相交連結串列"的三種方法

寫程式找尋兩個單鏈表開始相交的起點 For example, the following two linked lists: A: a1 → a2 ↘ c1 → c2 →

使用Java實現單向連結串列,並完成連結串列反轉。

使用Java實現單向連結串列,並完成連結串列反轉。 演算法和資料結構是程式設計師逃不過的一個坎,所以趁著閒餘時間,開始學習基礎的演算法和資料結構。這裡記錄下自己實現簡單的單項鍊表的過程,如有錯誤,敬請指正。 明確需求 在Java中,常用的資料容器裡面,跟連結串列關係緊密的當屬

python 實現雙向連結串列

用 python 寫單鏈表之後,雙向連結串列那就沒什麼難度了。 #coding=utf-8 __date__ = ' 17:07' __author__ = 'sixkery' # 雙鏈表的節點由資料域和指標域兩部分組成,指標域儲存兩個地址,一個是前驅結點,一

劍指offer66題--Java實現,c++實現python實現 14.連結串列中倒數第k個結點

題目描述 輸入一個連結串列,輸出該連結串列中倒數第k個結點。 C++實現 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/

使用JavaScript實現單向連結串列

一、實現功能   1、連結串列元素頭部插入 this.unShift = function(data) {}   2、連結串列元素尾部插入 this.append= function(data) {} //返回boolean   3、連結串列元素按位置插入 this.insert= funct

資料結構(Python實現)之連結串列

理解資料結構最好的方式就是用腦洞把它想象出來。 一、節點 class Node():     def __init__(self,data=None):         self.data=data    

C++ 實現單向連結串列

#include<iostream> #include<string> #include<stack> using namespace std; struct Node {int value;Node* Next; }; class List { private:

(C語言版)連結串列(一)——實現單向連結串列建立、插入、刪除等簡單操作(包含個人理解說明及註釋,新手跟著寫程式碼)

我學習了幾天資料結構,今天下午自己寫了一個單向連結串列的程式。我也是新手,所以剛開始學習資料結構的菜鳥們(有大牛們能屈尊看一看,也是我的榮幸)可以和我一起共同學習、討論,當然也很高興能指出我的錯誤,因為這是我們一起成長的過程。本程式碼包含我在寫程式時的一些個人理解的說

java實現--單向連結串列的插入和刪除

一、連結串列結構: (物理儲存結構上不連續,邏輯上連續;大小不固定)           概念:  鏈式儲存結構是基於指標實現的。我們把一個數據元素和一個指標稱為結點。        資料域:存數資料元素資訊的域。        指標域:儲存直接後繼位置的域。鏈式儲存結構是用

java實現單向連結串列CRUD,反轉,排序,查詢倒數第k個元素,遞迴輸出等操作

package myLink; import javax.xml.transform.Templates; public class LianBiao { static Node head=null; /** * 查詢單鏈表的中間節

Python實現LeetCode連結串列類演算法(例子:Merge k Sorted Lists)

連結串列的演算法關鍵點:新建立一個頭結點,並且將這個節點賦值給另外的連結串列物件來完成操作。 例如19. Remove Nth Node From End of List class Soluti

利用頭插法實現單向連結串列的逆置

        這篇文章將再次討論單向連結串列的逆置問題。在原來的那篇文章中,我用了三個指標實現了這一功能,這樣顯得非常的麻煩複雜,程式碼也寫的略長一些。但是最近一同學給我看她寫的程式碼,利用建立單向連結串列時的頭插法,只需兩個指標就輕鬆巧妙的實現了單向連結串列的逆置過程。

C++實現單向連結串列(1)

需要在你的主程式中新增#include "ListNode.cpp"ListNode.h#pragma once #include <iostream> using namespace std; template <typename T> clas

用c++實現單向連結串列和雙向連結串列

連結串列是一種非常基礎的資料結構,本身也比較靈活,突破了陣列在一開始就要確定長度的限制,能夠做到隨時使用隨時分配記憶體。同時還有新增,刪除,查詢等功能。 總的來說,連結串列是由幾個模組構成的。 一,單向連結串列 //連結串列基本元素 struct Nod