1. 程式人生 > >python資料結構——連結串列(最簡單的解釋)

python資料結構——連結串列(最簡單的解釋)

對於連結串列,當初學C的時候就沒有理解的很清楚,現在又重新遇到,要把這個弄明白。

資料結構是電腦科學必須掌握的一門學問,很多的教材都是用C語言實現連結串列,因為C有指標,可以很方便的控制記憶體,很方便就實現連結串列,其他的語言,則沒那麼方便,有很多都是用模擬連結串列,因為python是動態語言,可以直接把物件賦值給新的變數。在C/C++中,通常採用“指標+結構體”來實現連結串列;而在Python中,則可以採用“引用+類”來實現連結串列。

連結串列的定義:是一組資料項的集合,其中每個資料項都是一個節點的一部分,每個節點還包含指向下一個節點的連結

連結串列的結構:data為自定義的資料,next為下一個節點的地址。

基本元素

  1. 節點:每個節點有兩個部分,左邊部分稱為值域,用來存放使用者資料;右邊部分稱為指標域,用來存放指向下一個元素的指標。
  2. head:head節點永遠指向第一個節點
  3. tail: tail永遠指向最後一個節點
  4. None:連結串列中最後一個節點的指標域為None值

連結串列種類:單向連結串列、單向迴圈連結串列、雙向連結串列、雙向迴圈連結串列

在C語言中,我們定義插入、刪除靠得是指標來實現,引入一篇部落格,裡面的圖解釋的很清楚。連結串列的插入、刪除的處理

//c語言的程式碼 關於連結串列排序的程式碼
//解釋下我的思路,連結串列排序,理論上是數字在變換,但是我們要用連結串列來控制數字變化比較
//用的演算法依然是,冒泡法,和正常排序沒什麼區別。
//等效與陣列,這兒只不過是用指標來確定data位置

viod sort()
{
int i,j;
int temp;
int len=length_list(pHead);//
PNODE p,q;//定義指標

////利用氣泡排序,指標在移動,數字在交換,

for (i=0,p=pHead->pNext ; i<len-1 ; i++,p=p->pNext)///初始的指標p是在第一個元素上
{
for(j=i+1,q=p->pNext ; j<len ; j++,q=q->pNext)
{
//數字交換
if(p->data > q->data)
{
temp = p->data;
p->data = q->data;
q->data = temp;
}
}
}
}

但是python中沒有指標,實現插入、刪除、替換要怎麼去做??

python程式碼的實現,我們用引用+類來實現。

新增連結串列

刪除連結串列

插入連結串列(暫時不更新)

   

怎麼來好理解呢?看圖也是花了半個小時才理解透徹。

具體翻轉思路是,定義一個空的頭指標 pre,然後把head往後移,使連結串列裂開重組。

tmp = pHead.next

pHead = tmp %%%這兩行程式碼的意思是,把頭指標往後移一個,移到下一個數上。

pHead.next = pre

pre = pHead %%%這倆句的意思,我的pre開始指向none ,現在none給了pHead.next,所以資料1就裂開了

,然後再把數字1頭指標值賦值給pre,這樣就得到單獨數字1的值。然後把原pHead向後移。重複幾次,就可以反轉我們的連結串列了。

程式碼的順序要考慮,我們是先要儲存pHead.next,然後在把數字1裂開,在把pHead移向數字2。

附上4張圖:

相關推薦

python資料結構——連結串列簡單解釋

對於連結串列,當初學C的時候就沒有理解的很清楚,現在又重新遇到,要把這個弄明白。 資料結構是電腦科學必須掌握的一門學問,很多的教材都是用C語言實現連結串列,因為C有指標,可以很方便的控制記憶體,很方便就實現連結串列,其他的語言,則沒那麼方便,有很多都是用模擬連結串列,因為p

Python資料結構-連結串列

1)概念:連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。 相比於線性表順序結

資料結構-連結串列java實現

/** * 連結串列節點定義 * */ private class Node { private Object data; private Node next; public Node getNext() { return next;

資料結構——連結串列幾個拓展的做法

#include <stdio.h>//注意放在c++中 #include <stdlib.h> #include <string.h> typedef struct as{ int date; struct

資料結構——連結串列c++

myList.h template <class T> class List { void clear(); // 置空線性表 bool isEmpty();

資料結構——連結串列1如何找出連結串列中的倒數第k個元素

方法一:①遍歷連結串列,得到連結串列的長度n的值;②將倒數的k的序號轉換到順序排號(n-k+1);③遍歷連結串列,直到找到第(n-k+1)個元素。兩次遍歷,時間複雜度為O(n)。 方法二:從第一個元素開始,遍歷k個元素,判斷呢是否為NULL,若為空,則找到第k

C語言資料結構----連結串列靜態連結串列

看了老唐的靜態連結串列,越發的覺得自己是菜鳥了,因為看的過程實在是太糾結了。下面就把自己看老唐靜態連結串列的內容寫下來。 一、靜態連結串列的基礎知識 1.單鏈表的缺陷:單鏈表的實現嚴重依賴指標,每一個數據元素都要有額外的指標域。 2.在靜態表中我們把資料元素放在一個數組裡,

資料結構--連結串列C實現

連結串列是學習資料結構的基礎,何為資料結構,簡單來說就是研究資料的儲存問題,演算法是對資料的操作問題,儲存主要是個人的儲存和個人與個人的關係的儲存,研究如何將我們現實生活中各種事物及其關係的儲存。 連結串列的優缺點(相比於同是線性結構的陣列): 1.空間沒有限制

C++資料結構---連結串列連結串列建立

連結串列 是比較重要的一種資料結構,它的有點在於:插入和刪除操作。 與vector不同,list插入和刪除不需要移動其餘元素,而vector在中間插入時,需要將後面的元素依次向後移動,時間複雜度與待移動的元素有關,可見,元素越多,消耗的時間越多。而list插

為什麼我要放棄javaScript資料結構與演算法第五章—— 連結串列

這一章你將會學會如何實現和使用連結串列這種動態的資料結構,這意味著我們可以從中任意新增或移除項,它會按需進行擴張。 本章內容 連結串列資料結構 向連結串列新增元素 從連結串列移除元素 使用 LinkedList 類 雙向連結串列 迴圈連結串列 第五章 連結串列 連結串列資

資料結構-連結串列結構分析LinkedList

轉載請註明作者:Edison丶夢楠 如有錯誤之處,還請您務必在留言區留下您的寶貴經驗。或傳送郵箱:[email protected] 告知。 本人非常感謝!希望能和您共同學習,共同進步! 下面介紹連結串列的兩種結構: 單向連結串列:只能從頭遍歷到尾,或者從尾

資料結構——連結串列實現佇列泛型

package Test; public class LinkedListQueue { public static void main(String[] args) { // TODO Auto-generated method stub Queue <Integer>

[資料結構]連結串列的實現c++/類模板

#include <iostream> #include <cstdlib> using namespace std; //用struct定義LinkNode類.使用這種方法使該類失去封裝性,但簡化了描述. //在Link類中把first封裝在了其

資料結構學習筆記-迴圈連結串列C語言實現

  迴圈連結串列的概念主要就是讓單鏈表的尾節點的指標不為空並且指向頭節點。像這樣的迴圈連結串列和普通單鏈表除了判斷條件幾乎沒有任何區別,判斷條件就是從p->next是否為空改為p->next是否等於頭節點,如果等於頭節點則迴圈結束。#include <std

資料結構單鏈表之建立連結串列尾插法

接上一篇內容,這次使用尾插法來建立單鏈表: 1.同樣建立連結串列成員結構體: struct listnode { int value; listnode* next; }; 2.然後下面就是通過尾插法建立單鏈表的程式,這裡面稍稍要去理解

資料結構連結串列的基本操作c語言程式碼

連結串列連結串列也是一種線性表,與順序表不同之處在於不像順序表佔據一段連續的儲存空間,而是將儲存單元分散在記憶體的任意地址上。連結串列結構中,儲存每個資料時候都會把記錄寫在連結串列的一個結點(node)中,每個結點之間由指標相連,形成如同鏈子的結構。結點(node):可以是一

資料結構之單向連結串列C++語言描述

該檔案是整個原始檔,包括單向連結串列節點的定義,各種操作函式,main()測試用例。 #include <iostream> using namespace std; struct ListNode //用class時需要加publi

演算法與資料結構3:基本資料結構——連結串列,棧,佇列,有根樹

原本今天是想要介紹堆排序的。雖然堆排序需要用到樹,但基本上也就只需要用一用樹的概念,而且還只需要完全二叉樹,實際的實現也是用陣列的,所以原本想先把主要的排序演算法講完,只簡單的說一下樹的概念。但在寫的過程中才發現,雖然是隻用了一下樹的概念,但要是樹的概念沒講明白的話,其實不太好理解。所以決定先介紹一下基本的資

單鏈表基本操作刪除連結串列大元素

題目描述: 設計一個演算法,刪除一個單鏈表L中元素值最大的節點(假設這樣的節點唯一) 解題思路: 在單鏈表中刪除一個節點先要找到它的前驅節點,用指標p掃描整個單鏈表,pre指向節點p的前驅節點,在掃描時用maxp指向data域值最大的節點,maxpre指向maxp所指節點的前驅節點,當連

js資料結構 -- 連結串列, 雙向連結串列,迴圈連結串列

陣列作為js常用的資料結構,存取元素都非常的方便,但是其內部的實現原理跟其他計算機語言對陣列的實現都是一樣的。 由於陣列在記憶體中的儲存是連續的,所以當在陣列的開頭或者中間插入元素時,內部都需要去移動其他元素的位置,這個移動元素的成本很高。 連結串列也是儲存有序的元素集合,但不同