欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python單向鏈表和雙向鏈表原理與用法實(shí)例詳解

 更新時(shí)間:2018年08月31日 14:31:53   作者:每天1990  
這篇文章主要介紹了Python單向鏈表和雙向鏈表原理與用法,結(jié)合實(shí)例形式詳細(xì)分析了單向鏈表與雙向鏈表的概念、原理以及創(chuàng)建、添加、刪除等相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了Python單向鏈表和雙向鏈表原理與用法。分享給大家供大家參考,具體如下:

鏈表是一種數(shù)據(jù)結(jié)構(gòu),鏈表在循環(huán)遍歷的時(shí)候效率不高,但是在插入和刪除時(shí)優(yōu)勢比較大。

鏈表由一個(gè)個(gè)節(jié)點(diǎn)組成。

單向鏈表的節(jié)點(diǎn)分為兩個(gè)部分:存儲的對象和對下一個(gè)節(jié)點(diǎn)的引用。注意是指向下一個(gè)節(jié)點(diǎn)。

而雙向鏈表區(qū)別于單向鏈表的是它是由三個(gè)部分組成:存儲的對象、對下一個(gè)節(jié)點(diǎn)的引用、對上一個(gè)節(jié)點(diǎn)的引用,可以實(shí)現(xiàn)雙向遍歷。

單向列表的結(jié)構(gòu)如下圖:

head是頭節(jié)點(diǎn),tail是尾節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)由Data存儲對象和Next對下一個(gè)節(jié)點(diǎn)引用組成

下面說一下單向鏈表插入和刪除的過程。

插入一個(gè)新節(jié)點(diǎn):

原理:前一個(gè)節(jié)點(diǎn)的Next指向當(dāng)前新節(jié)點(diǎn),新節(jié)點(diǎn)的Next指向要插入節(jié)點(diǎn)位置的后一個(gè)節(jié)點(diǎn)。

注意:在實(shí)際應(yīng)用時(shí)需要考慮插入位置是頭結(jié)點(diǎn)和尾節(jié)點(diǎn)的情況。

刪除一個(gè)節(jié)點(diǎn):

原理:找到要刪除節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn),直接上一個(gè)節(jié)點(diǎn)的Next指向刪除位置的下一個(gè)節(jié)點(diǎn)。

注意:在實(shí)際應(yīng)用中需要考慮到刪除的節(jié)點(diǎn)是否是頭節(jié)點(diǎn)或尾節(jié)點(diǎn),需要考慮到鏈表的長度。

下面附上一個(gè)用python寫的單鏈表的例子。

class Node:
  next = None
  data = None
  def __init__(self,nodeData):
    self.data = nodeData
class List:
  head = None
  size = 0
  def __init__(self):
    self.size = 0
    self.head = None
  #遍歷鏈表
  def a(self):
    print("avx")
  def printlist(self):
    p=self.head
    while(p is not None):
      print(p.data)
      p=p.next
    print("——————————————————————————————————————")
  def insertlink(self, a, newdata):
    newnode = Node(newdata)
    if self.size == 0:
      print("The link is none")
      self.head = newnode
      self.size = self.size+1
    else:
      p = self.head
      while(p is not None )and (p.data != a):
        p = p.next
      if p.next is None:
        p.next = newnode
        self.size = self.size + 1
      else:
        newnode.next = p.next
        p.next = newnode
        self.size = self.size + 1
  #刪除鏈表中的節(jié)點(diǎn)
  def deldata(self,a):
    if self.size == 0:
      print("The link is none")
    elif self.size ==1:
      self.head = None
      self.size = self.size -1
    else:
      p = self.head
      while(p is not None )and (p.data != a):
        q = p
        p = p.next
      if p is None:
        print("Can't find a")
      elif p == self.head:
        self.head = p.next
      elif p.data ==a and p.next is not None:
        q.next = q.next.next
        self.size = self.size - 1
      else:
        q.next = None
        self.size = self.size - 1
  #修改鏈表中的指定節(jié)點(diǎn)
  def updatelink(self,a,b):
    p = self.head
    print(p.data)
    while(p is not None ) and (p.data!=a):
      p = p.next
    if p is None:
      print("Can't find a")
    else:
        p.data = b
if __name__=="__main__":
    p = List()
    p.insertlink(1,1)
    p.insertlink(1,2)
    p.insertlink(1,3)
    p.insertlink(1,4)
    print("_________________________---insertlink")
    p.printlist()
    print("_________________________--chalink")
    p.updatelink(2,5)
    p.printlist()
    print("___________________________-----dellink")
    p.deldata(5)
    p.printlist()

運(yùn)行結(jié)果:

The link is none
_________________________---insertlink
1
4
3
2
——————————————————————————————————————
_________________________--chalink
1
1
4
3
5
——————————————————————————————————————
___________________________-----dellink
1
4
3
——————————————————————————————————————

雙向鏈表的結(jié)構(gòu)如下圖:

head是頭節(jié)點(diǎn),tail是尾節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)由Data存儲對象,Next對下一個(gè)節(jié)點(diǎn)的引用和Pre對上一個(gè)節(jié)點(diǎn)的引用組成??梢詫?shí)現(xiàn)雙向的遍歷

下面說一下雙向鏈表的插入和刪除

插入一個(gè)新節(jié)點(diǎn):

原理:

找到要插入的節(jié)點(diǎn)位置,新節(jié)點(diǎn)的Next指向插入位置的下一個(gè)節(jié)點(diǎn),插入位置的下一個(gè)節(jié)點(diǎn)的Pre指向新節(jié)點(diǎn)。
插入位置節(jié)點(diǎn)的左側(cè)Next指向新節(jié)點(diǎn),新節(jié)點(diǎn)的Pre指向左側(cè)的節(jié)點(diǎn)。

刪除一個(gè)節(jié)點(diǎn):

說明:

找到要刪除的節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn)
直接把上一個(gè)節(jié)點(diǎn)的Next指向要刪除節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)
并把要刪除節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)的Pre指向要上出節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn)即可

雙向鏈表的代碼:

class Node():
  data = None
  nextnode = None
  prenode = None
  def __init__(self, data):
    self.data = data
class PersonChan():
  size = 0
  head = None
  tail = None
  def __init__(self):
    self.head = None
    self.tail = None
    self.size = 0
  #增加節(jié)點(diǎn)
  def add_node(self, a):
    newnode = Node(a)
    if(self.head == None):
      self.head = newnode
      self.head.prenode = None
      self.tail = newnode
      self.tail.prenode = None
      self.tail.nextnode = None
      self.size = self.size+1
    else:
      temp = self.head
      while temp.nextnode is not None:#返回尾節(jié)點(diǎn)tail
        temp = temp.nextnode
      temp.nextnode = newnode
      self.tail = newnode
      self.tail.prenode = temp
      self.tail.nextnode = None
      self.size = self.size+1
  #在查找到的a后面增加節(jié)點(diǎn)
  def ins_node(self,a,b):
    newnode = Node(b)
    if self.head ==None:
      self.head = newnode
      self.tail = newnode
      print("Insert success:",newnode.data)
      self.size = self.size +1
    else:
      temp = self.head
      while(temp is not None)&(temp.data != a):
        temp = temp.nextnode
      if temp.nextnode == None:
        temp.nextnode = newnode
        self.tail = newnode
        self.tail.prenode = temp
        self.tail.nextnode = None
        temp = None
        print("Insert success:",newnode.data)
        self.size = self.size+1
      else:
        newnode.prenode = temp
        newnode.nextnode = temp.nextnode
        temp.nextnode = newnode
        print("Insert success:",newnode.data)
        self.size = self.size+1
  #刪除節(jié)點(diǎn)
  def del_node(self,a):
    if self.head == None:
      pass
    elif self.head.data == a:
      if self.size ==1:
        self.head = None
        self.tail = None
        self.size = self.size-1
      else:
        self.head = self.head.nextnode
        self.size = self.size -1
    else:
      temp = self.head.nextnode
      while (temp is not None) and (temp.data != a):
        temp = temp.nextnode
      p = temp.prenode
      if temp != None:
        if temp.nextnode == None:
          self.tail = p
          self.tail.nextnod = None
        else:
          p.nextnode = temp.nextnode
          temp = None
        self.size = self.size -1
        print("Delete is success:",a)
  def listall(self):#正序排列
    if self.size == 0:
      print("No data in the list")
    else:
      temp = self.head
      while(temp is not None):
        print(temp.data)
        temp = temp.nextnode
  def lista(self):#倒序排列
    if self.size == 0:
      print("No data in the list")
    temp = self.tail
    while(temp is not None):
      print(temp.data)
      temp = temp.prenode
if __name__ == '__main__':
  link = PersonChan()
  link.add_node(1)
  link.add_node(2)
  link.add_node(3)
  link.add_node(4)
  link.listall()
  print("The list's size is:",link.size)
  link.lista()

運(yùn)行結(jié)果:

1
2
3
4
("The list's size is:", 4)
4
3
2
1

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python加密解密算法與技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門與進(jìn)階經(jīng)典教程

希望本文所述對大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 據(jù)Python爬蟲不靠譜預(yù)測可知今年雙十一銷售額將超過6000億元

    據(jù)Python爬蟲不靠譜預(yù)測可知今年雙十一銷售額將超過6000億元

    已經(jīng)是十一月十號了,雙十一即將到來,電商早已預(yù)熱多日,為了在實(shí)戰(zhàn)中獲得能力的提升,本篇文章手把手帶你用Python來預(yù)測一下今年雙十一的銷售額將會達(dá)到多少,大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • 布同 統(tǒng)計(jì)英文單詞的個(gè)數(shù)的python代碼

    布同 統(tǒng)計(jì)英文單詞的個(gè)數(shù)的python代碼

    最近需要翻譯英文文章,所以需要統(tǒng)計(jì)單詞個(gè)數(shù)。索性寫了一段代碼在此,可以簡單的統(tǒng)計(jì)單詞的個(gè)數(shù)
    2011-03-03
  • 詳解python中@的用法

    詳解python中@的用法

    這篇文章主要介紹了python中@的用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 關(guān)于python的第三方庫下載與更改方式

    關(guān)于python的第三方庫下載與更改方式

    這篇文章主要介紹了關(guān)于python的第三方庫下載與更改方式,使用python的朋友都知道python有很多非常方便的第三方庫可以使用,那么如果下載這些第三方庫呢,今天小編就帶你們來看看
    2023-04-04
  • Python?Pyecharts繪制?;鶊D分析用戶行為路徑

    Python?Pyecharts繪制桑基圖分析用戶行為路徑

    這篇文章主要為大家介紹了Python?Pyecharts繪制?;鶊D分析用戶行為路徑,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • python打包生成的exe文件運(yùn)行時(shí)提示缺少模塊的解決方法

    python打包生成的exe文件運(yùn)行時(shí)提示缺少模塊的解決方法

    今天小編就為大家分享一篇python打包生成的exe文件運(yùn)行時(shí)提示缺少模塊的解決方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python類繼承和多態(tài)原理解析

    Python類繼承和多態(tài)原理解析

    這篇文章主要介紹了python類繼承和多態(tài)原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 跟老齊學(xué)Python之Python文檔

    跟老齊學(xué)Python之Python文檔

    文檔,這個(gè)詞語在經(jīng)常在程序員的嘴里冒出來,有時(shí)候他們還經(jīng)常以文檔有沒有或者全不全為標(biāo)準(zhǔn)來衡量一個(gè)軟件項(xiàng)目是否高大上。那么,軟件中的文檔是什么呢?有什么要求呢?python文檔又是什么呢?文檔有什么用呢?
    2014-10-10
  • 我用Python做個(gè)AI出牌器斗地主把把贏

    我用Python做個(gè)AI出牌器斗地主把把贏

    這篇文章主要介紹了我是如何用Python做的AI出牌器,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • ubuntu遷移anaconda到另外的目錄(完美解決)

    ubuntu遷移anaconda到另外的目錄(完美解決)

    本文主要介紹了ubuntu遷移anaconda到另外的目錄,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評論