單鏈表基本操作Python實現

最近在學數據結構的C語言實現,同時希望加深自己對數據結構的理解,想要用Python也實現一下,但是Python實現相比C實現代碼顯得簡而易懂。

鏈表的定義

採用鏈式存儲結構的線性表稱爲鏈表

分類

從鏈接方式:單鏈表、循環鏈表、雙鏈表

結點類:

Node(結點)有兩個域,一個是數據域(存值),另外一個是指針域(存地址)
其中頭結點的數值域通常不存儲值
給一個帶頭結點的單鏈表的例子:
帶頭結點的單鏈表
結點的指針域存的是下一個結點的存儲地址:
在這裏插入圖片描述

尾插法

即將一個結點插入到鏈表的末尾。
先將待插入結點的指針域指向尾結點的指針域指向的存儲位置(即None),再將尾結點的指針域指向待插入結點
在這裏插入圖片描述

頭插法

即將一個結點插入到鏈表的頭。
先將待插入結點的指針域指向頭結點的指針域指向的存儲位置(即c2),再將頭結點的指針域指向待插入結點
在這裏插入圖片描述

Aclass Node:                      #結點類
   def __init__(self,data):
      self._data = data
      self._next = None

class LinkList:                     #鏈表類
   def __init__(self):
      self._head = Node(None)
      self._tail = self._head
      self._len = 0

   def addNode_tail(self,data): #尾插法插入結點
      new_node = Node(data)   #實例化一個結點
      self._tail._next  = new_node   #修改尾結點的指針域
      self._tail = new_node   #修改尾結點位置
      self._len +=1

   def addNode_head(self,data):#頭插法插入結點
      new_node = Node(data)   #實例化一個結點
      new_node._next = self._head._next   #修改插入結點的指針域
      self._head._next = new_node #修改頭結點的指針域
      self._len +=1
      
   def insertNode(self,data,pos):#在第pos個結點前插入結點
      if pos > self._len or pos < 1:
         print("inputs pos is error!")
         return False
      else:
         temp = self._head
         ins_node = Node(data)
         for i in range(pos-1):   #找到第pos-1個結點,即目標結點的前結點,然後尾插
            temp = temp._next
         ins_node._next = temp._next
         temp._next =ins_node
         self._len +=1
         return True

   def  delnode_pos(self,pos=1):  #刪除第pos個結點,默認刪除第一個
      if pos > self._len or pos <1:
         print("inputs pos is error!")
         return False
      if pos == 1:
         self._head._next = sef._head._next._next
         self._len  -=1
      else:
         temp = self._head
         for i in range(pos-1):  #找到待刪除結點的前一個結點
            temp = temp._next  
         temp._next = temp._next._next   #修改其指針域,即略過待刪除結點
         self._len  -=1
      return True

   def printLink(self):                         #打印鏈表
      temp = self._head._next
      for i in range(self._len):
         print(temp._data,end = "->")
         temp = temp._next
      print("None")

   def changeNodeData(self,pos,data): #改變結點數據
      if pos > self._len or pos <1:
         print("inputs pos is error!")
         return False
      temp = self._head
      for i in range(pos):
         temp = temp._next
      temp._data = data
      return True
      
   def getNodeData(self,pos):           #返回結點的數據
      if pos > self._len or pos <1:
         print("inputs pos is error!")
         return False
      temp = self._head
      for i in range(pos):
         temp = temp._next
      return temp._data

   def getLinkLen(self):           #返回鏈表長度
      return self._len


   def reverseLink(self):           #鏈表反轉(實質也就是將原來的鏈表重新進行頭插建表)
      temp = self._head._next._next._next
      pre = self._head._next._next
      self._tail = self._head._next
      self._tail._next = None
      while temp:
         pre._next = self._head._next
         self._head._next = pre
         pre = temp
         temp = temp._next
      pre._next = self._head._next
      self._head._next = pre
      return True

   def connectLink(self,link): #連接兩個鏈表
      self._tail._next  = link._head._next
      self._len = self._len + link._len
      return True
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章