1. 程式人生 > >python資料結構 -無序列表-連結串列

python資料結構 -無序列表-連結串列

為了實現無序列表,我們將構造通常所知的連結串列。回想一下,我們需要確保我們可以保持項的相對定位。

Node 類:
連結串列實現的基本構造塊是節點。每個節點物件必須至少儲存兩個資訊。首先,節點必須包含列表項本身。我們將這個稱為節點的資料欄位。此外,每個節點必須儲存對下一個節點的引用。 Node 類還包括訪問,修改資料和訪問下一個引用的常用方
法。


程式碼如下:

class Node:
    def __init__(self,inindata):
        self.data = inindata
        self.next = None

    def getData(self):
        return self.data

    def getNext(self):
        return self.next

    def setData(self,newdata):
        self.data = newdata

    def setNext(self,newnext):
        self.next = newnext

建立一個NODE物件:

>>> temp = Node(93)
>>> temp.getData()
93

觀察下 NODE方法。其中

  • __init__()初始化方法。傳入一個data值,一個next指向None
  • getData()獲取data值方法,直接返回self.data
  • getNext()獲取next值方法,直接返回self.next
  • setData()設定data值,傳入一個newdata,賦值給self.data
  • setNext()設定next值,傳入newnext,賦值返回給self.next

Unordered List

如上所述,無序列表將從一組節點構建,每個節點通過顯式引用連結到下一個節點。只要我們知道在哪裡找到第一個節點(包含第一個項) ,之後的每個項可以通過連續跟隨下一個連結找到。考慮到這一點,

UnorderedList 類必須保持對第一個節點的引用。

程式碼如下:

class UnorderedList:

    def __init__(self):
        self.head = None

    def isEmpty(self):
        return self.head == None

    def add(self,item):
        temp = Node(item)
        temp.setNext(self.head)
        self.head = temp

    def size(self):
        current = self.head
        count = 0
        while current != None:
            count = count + 1
            current = current.getNext()

        return count

    def search(self,item):
        current = self.head
        found = False
        while current != None and not found:
            if current.getData() == item:
                found = True
            else:
                current= current.getNext()
        #print current.getData()
        return found

    def remove(self,item):
        current =self.head
        previous = None
        found = False
        while not found:
            if current.getData() == item:
                found = True
            else:
                previous = current
                current = current.getNext()
        if previous == None:
            self.head = current.getNext()
        else:
            previous.setNext(current.getNext())

看起來很多的樣子,不要慌,我們慢慢來。

雖然python沒有指標的概念,但是如果先理解了指標再來看這段程式碼,其實很好理解。

__init__初始化方法。將頭部設為空self.head = None

isEmpty()方法。看下head是不是為空,為空返回True,則此時列表為空。反之相反。 return self.head == None (順帶一提,我覺得這種寫法相當python)

add()方法。注意這裡開始引用了Node類,我先把程式碼貼出來

    def add(self,item):
        temp = Node(item)
        temp.setNext(self.head)
        self.head = temp
來捋一捋哈,首先構造了一個Node例項temp,傳入了item值作為temp的data,然後設定了next值為當前頭部值,再把當前值賦值給self.head
>>> mylist.add(31)
>>> mylist.add(77)
>>> mylist.add(17)
>>> mylist.add(93)
>>> mylist.add(26)
>>> mylist.add(54)

因為 31 是新增到連結串列的第一個項,它最終將是連結串列中的最後一個節點,因為每個其他項在其前面新增。此外,由於 54 是新增的最後一項,它將成為連結串列的第一個節點中的資料值。

這是最開始的樣子,head和node.next都是指向none

這是add方法的樣子 。。。嗯,將就看

size()方法,其實就是先設定個當前值current等於頭部,然後只要當前值不為None,就一層一層的getnext(),然後計數。

serch(self,item)。一樣的道理,和size()很向,傳入一個要查詢的值,也是cureent設為頭部,一層層往下找,然後getdata()判斷是不是和item相等,等於就跳出迴圈然後然後bool變數,不等就接著current=current.getnext()

remove()方法,這個其實是最難的,在serch的基礎上我們找到了之後還要刪除一個item。怎麼刪呢?就是把前一個節點的值,傳到下一個節點去。當前節點不就空了嗎。然後再稍微來點判斷,比如萬一前節點沒有咋辦。比如後一個節點沒有咋辦(這個其實不用考慮,因為本來最後一個節點的next就是空的,前一個節點的next等於當前節點的getnext,也是空的)

單獨貼個程式碼

    def remove(self,item):
        current =self.head
        previous = None
        found = False
        while not found:
            if current.getData() == item:
                found = True
            else:
                previous = current
                current = current.getNext()
        if previous == None:
            self.head = current.getNext()
        else:
            previous.setNext(current.getNext())

相關推薦

python資料結構 -無序列表-連結串列

為了實現無序列表,我們將構造通常所知的連結串列。回想一下,我們需要確保我們可以保持項的相對定位。Node 類: 連結串列實現的基本構造塊是節點。每個節點物件必須至少儲存兩個資訊。首先,節點必須包含列表項本身。我們將這個稱為節點的資料欄位。此外,每個節點必須儲存對下一個節點的

1.6 python資料結構之雙向連結串列/迴圈連結串列——以OrderedDict資料結構為例

在連結串列這一部分的最後,我們以python中十分強大的collections包中的OrderedDict為例,看一下雙向迴圈列表的功能實現。 OrderedDict 它提供了有序的dict結構,因此他不是常規的雜湊雜湊表,為了保證儲存物件有序,它用連結串列實現了這一功能,

資料結構之單向連結串列----python實現

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

字串資料結構實現(連結串列方式)

相較於陣列方式的實現,C語言我採用了單鏈表的方式實現,C++採用了雙鏈表的方式。毫無疑問,雙鏈表的效率肯定是要遠高於單鏈表的。這次支援中文字元的操作,這個實現的思路是,在節點類中新增兩個成員變數,一個用來存放char字元,一個用來存放wchar_t字元。關於兩者的相互轉換及輸出請參考 C語言

SDUTOJ-2054 資料結構實驗之連結串列九:雙向連結串列

 題目連結 #include <iostream> #include <cstdlib> using namespace std; typedef int ElementType; typedef struct node { ElementType

SDUTOJ-3331 資料結構實驗之連結串列八:Farey序列

連結串列節點插入練習題 題目連結 #include <stdio.h> #include <cstdlib> using namespace std; typedef int ElementType; typedef struct node { Elemen

資料結構】環形連結串列

給定一個連結串列,判斷連結串列中是否有環。 思路分析: 判斷連結串列是否帶環,實際上歸屬於快慢指標問題,快指標先進環,慢指標後進環,然後快指標和慢指標最終會在環裡面相遇,如果不會相遇,則表示不是迴圈連結串列,也就是說到頭了,即不帶環。 具體程式碼如下: /**

資料結構】雙向連結串列的實現

文章目錄 LinkList.h LinkLish.c LinkList.h #ifndef __LINKLIST_H__ #define __LINKLIST_H__ #include <stdio.h>

資料結構-單向連結串列

package com.mzs.demo5; public class Node { private int data; private Node next; public Node(int data) { this.data = data; } public void

java版資料結構與演算法—連結串列實現佇列

package com.zoujc.QueueLink; /** * 連結串列實現佇列 */ class FirstLastList { private Link first; private Link last; public FirstLastList(){

java版資料結構與演算法—連結串列實現棧

package com.zoujc; /** * 用連結串列實現棧 */ class MyLinkStack { private Link first; public MyLinkStack(){ first = null; } //判空

JS資料結構和演算法 --- 連結串列

概念:性質類似於陣列,是計算機的一種儲存結構。連結串列由一系列結點組成,每個結點裡包含了本結點的資料域和指向下一個結點的指標(裡面儲存著下一個結點)。 作用:按一定順序儲存資料,允許在任意位置插入和刪除結點。 分類:雙向連結串列、迴圈連結串列 應用場景:對線性表的長度或者規模難

嚴蔚敏版資料結構——佇列(連結串列實現)

佇列有兩種表示方式,我們再看連結串列實現: 個人感覺佇列也就是連結串列的一種特殊表,如果前面的連結串列知識通關了這裡隨便看看記住佇列的遊戲規則就行了。還是和前面一樣,先要有頭結點,總體來說就是單鏈表的插刪。 這裡與順序佇列不同的是不需要判斷佇列是不是滿了,連結串列最大的特點是動態分配節點空間

資料結構實驗之連結串列一:順序建立連結串列(SDUT 2116)

Problem Description 輸入N個整數,按照輸入的順序建立單鏈表儲存,並遍歷所建立的單鏈表,輸出這些資料。 Input 第一行輸入整數的個數N; 第二行依次輸入每個整數。 Outp

資料結構實驗之連結串列三:連結串列的逆置(SDUT 2118)

題目連結 #include <bits/stdc++.h> using namespace std; struct node { int data; struct no

Java手寫LinkedList 應用資料結構之雙向連結串列

作為Java程式設計師,紮實的資料結構演算法能力是必須的 LinkedList理解的最好方式是,自己手動實現它         ArrayList和LinkedList是順序儲存結構和鏈式儲存結構的表在java語言中的實現.   ArrayList提供了一種可增長陣

資料結構與演算法——連結串列

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

演算法——資料結構(單向連結串列的實現)

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

資料結構之核心連結串列

核心連結串列設計的非常巧妙,但也不是什麼難理解的內容,關於核心連結串列的介紹網上有很多,這裡就不贅述了,來個使用的例子吧。 list.h #ifndef HS_KERNEL_LIST_H #define HS_KERNEL_LIST_H #define offsetof(TYPE, MEM

資料結構實驗之連結串列八:Farey序列

Problem Description Farey序列是一個這樣的序列:其第一級序列定義為(0/1,1/1),這一序列擴充套件到第二級形成序列(0/1,1/2,1/1),擴充套件到第三極形成序列(0/1,1/3,1/2,2/3,1/1),擴充套件到第四級則形成序列(0/1,