最近在學數據結構的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