Python實現的資料結構與演算法之鏈表詳解_python

來源:互聯網
上載者:User

本文執行個體講述了Python實現的資料結構與演算法之鏈表。分享給大家供大家參考。具體分析如下:

一、概述

鏈表(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 = newnextclass SinCycLinkedlist:  def __init__(self):    self.head = Node(None)    self.head.setNext(self.head)  def add(self, item):    temp = Node(item)    temp.setNext(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 cur.getData() == 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()    while cur != self.head:      count += 1      cur = cur.getNext()    return countif __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.pys.empty() == True, s.size() == 0s.empty() == False, s.size() == 286 is in s4 is not in ss.empty() == False, s.size() == 2s.empty() == False, s.size() == 1

希望本文所述對大家的Python程式設計有所協助。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.