Python實現的資料結構與演算法之鍊錶詳解

2022-10-04 23:09:29 字數 2846 閱讀 3288

一、概述

鍊錶(linked list)是一組資料項的集合,其中每個資料項都是乙個節點的一部分,每個節點還包含指向下乙個節點的鏈結。

根據結構的不同,鍊錶可以分為單向鍊錶、單向迴圈鍊錶、雙向鍊錶、雙向迴圈鍊錶等。其中,單向鍊錶和單向迴圈鍊錶的結構如下圖所示:

二、adt

這裡只考慮單向迴圈鍊錶adt,其他型別的鍊錶adt大同小異。單向迴圈鍊錶adt(抽象資料型別)一般提供以下介面:

① sincyclinkedlist() 建立單向迴圈鍊錶

② add(item) 向鍊錶中插入資料項

③ remove(item) 刪除鍊錶中的資料項

④ search(item) 在鍊錶中查詢資料項是否存在

⑤ empty() 判斷鍊錶是否為空

⑥ size() 返回鍊錶中資料項的個數

單向迴圈鍊錶操作的示意圖如下:

三、python實現

python的內建型別list底層是由c陣列實現的,list在功能上更接近c++的vector(因為可以動態調整陣列大小)。我們都知道,陣列是連續列表,鍊錶是鏈結列表,二者在概念和結構上完全不同,因此list不能用於實現鍊錶。

在c/c++中,通常採用「指標+結構體」來實現鍊錶;而在python中,則可以採用「引用+類」來實現鍊錶。在下面的**中,sincyclinkedlist類代表單向迴圈鍊錶,node類代表鍊錶中的乙個節點:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

class node:

def __init__(self, initdata):

self.__data 程式設計客棧= initdata

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

class sincyclinkedlist:

def __init__(self):

self.head = node(none)

self.head.setnext(self.head)

def add(self, item):

temp = node(item)

temp.setnex程式設計客棧t(self.head.getnext())

self.head.setnext(temp)

def remove(self, item):

prev = self.head

while prev.getnext() != self.head:

cur = prev.getnext()

if cur.getdata() == item:

prev.setnext(cur.getnext())

prev = prev.getnext()

def search(self, item):

cur = self.head.getnext()

while cur != self.head:

if cu == item:

return true

cur = cur.getnext()

return false

def empty(self):

return self.head.getnext() == self.head

def size(self):

count = 0

cur = self.head.getnext()

wh程式設計客棧ile cur != self.head:

count += 1

cur = cur.gewww.cppcns.comtnext()

return count

if __name__ == '__main__':

s = sincyclinkedlist()

print('s.empty() == %s, s.size() == %s' % (s.empty(), s.size()))

s.add(19)

s.add(86)

print('s.empty() == %s, s.size() == %s' % (s.empty(), s.size()))

print('86 is%s in s' % ('' if s.search(86) else ' not',))

print('4 is%s in s' % ('' if s.search(4) else ' not',))

print('s.empty() == %s, s.size() == %s' % (s.empty(), s.size()))

s.remove(19)

print('s.empty() == %s, s.size() == %s' % (s.empty(), s.size()))

執行結果:

$ python sincyclinkedlist.py

s.empty() == true, s.size() == 0

s.empty() == false, s.size() == 2

86 is in s

4 is not in s

s.empty() == false, s.size() == 2

s.empty() == false, s.size() == 1

本文標題: python實現的資料結構與演算法之鍊錶詳解

本文位址:

算分與資料結構 冒泡思想

冒泡思想的乙個特點是所有的操作都在原陣列中進行,不占用額外的空間。一 氣泡排序 public class bubblesort public static void main string args new bubblesort bubblesort array for int i 0 i 二 冒泡...

資料結構 Python實現

參考部落格 演算法和資料結構 一 棧和佇列 python資料結構 棧 佇列的實現 一 python資料結構 棧 佇列的實現 二 python資料結構 鍊錶的實現 資料結構 定義 簡單來說,資料結構就是設計資料以何種方式組織並儲存在計算機中。比如 列表 集合與字典等都是一種資料結構。ps 程式 資料結...

資料結構 Python實現

參考部落格 演算法和資料結構 一 棧和佇列 python資料結構 棧 佇列的實現 一 python資料結構 棧 佇列的實現 二 python資料結構 鍊錶的實現 資料結構 定義 簡單來說,資料結構就是設計資料以何種方式組織並儲存在計算機中。比如 列表 集合與字典等都是一種資料結構。ps 程式 資料結...