中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-10-01 18:28:27 來源:腳本之家 閱讀:176 作者:每天1990 欄目:開發技術

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

鏈表是一種數據結構,鏈表在循環遍歷的時候效率不高,但是在插入和刪除時優勢比較大。

鏈表由一個個節點組成。

單向鏈表的節點分為兩個部分:存儲的對象和對下一個節點的引用。注意是指向下一個節點。

而雙向鏈表區別于單向鏈表的是它是由三個部分組成:存儲的對象、對下一個節點的引用、對上一個節點的引用,可以實現雙向遍歷。

單向列表的結構如下圖:

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

head是頭節點,tail是尾節點,每個節點由Data存儲對象和Next對下一個節點引用組成

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

插入一個新節點:

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

原理:前一個節點的Next指向當前新節點,新節點的Next指向要插入節點位置的后一個節點。

注意:在實際應用時需要考慮插入位置是頭結點和尾節點的情況。

刪除一個節點:

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

原理:找到要刪除節點的上一個節點,直接上一個節點的Next指向刪除位置的下一個節點。

注意:在實際應用中需要考慮到刪除的節點是否是頭節點或尾節點,需要考慮到鏈表的長度。

下面附上一個用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
  #刪除鏈表中的節點
  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
  #修改鏈表中的指定節點
  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()

運行結果:

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

雙向鏈表的結構如下圖:

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

head是頭節點,tail是尾節點,每個節點由Data存儲對象,Next對下一個節點的引用和Pre對上一個節點的引用組成。可以實現雙向的遍歷

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

插入一個新節點:

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

原理:

找到要插入的節點位置,新節點的Next指向插入位置的下一個節點,插入位置的下一個節點的Pre指向新節點。
插入位置節點的左側Next指向新節點,新節點的Pre指向左側的節點。

刪除一個節點:

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

說明:

找到要刪除的節點的上一個節點
直接把上一個節點的Next指向要刪除節點的下一個節點
并把要刪除節點的下一個節點的Pre指向要上出節點的上一個節點即可

雙向鏈表的代碼:

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
  #增加節點
  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:#返回尾節點tail
        temp = temp.nextnode
      temp.nextnode = newnode
      self.tail = newnode
      self.tail.prenode = temp
      self.tail.nextnode = None
      self.size = self.size+1
  #在查找到的a后面增加節點
  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
  #刪除節點
  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()

運行結果:

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

更多關于Python相關內容感興趣的讀者可查看本站專題:《Python數據結構與算法教程》、《Python加密解密算法與技巧總結》、《Python編碼操作技巧總結》、《Python函數使用技巧總結》、《Python字符串操作技巧匯總》及《Python入門與進階經典教程》

希望本文所述對大家Python程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

湘乡市| 奈曼旗| 兴业县| 普定县| 马尔康县| 偃师市| 临沧市| 嘉祥县| 神木县| 怀柔区| 信丰县| 永城市| 岳池县| 鄂温| 丰宁| 定安县| 昌平区| 新竹县| 冕宁县| 珠海市| 宜黄县| 靖宇县| 乐东| 彭山县| 华容县| 盐城市| 锡林浩特市| 车险| 毕节市| 永和县| 钟祥市| 河间市| 宜城市| 榆中县| 嘉祥县| 手游| 日照市| 衡阳县| 宝鸡市| 武安市| 泰州市|