Python實現基礎資料結構--單向連結串列
阿新 • • 發佈:2019-02-14
連結串列
*CSDN不支援mermaid語法,所以圖在該網站就看不到了
節點類
連結串列的基礎是節點,先宣告節點類:
class Node(object):
def __init__(self, data, nextNode = None):
self.data = data
self.nextNode = nextNode
連結串列類
連結串列的初始變數是頭節點,為空。
class LinkList(object):
def __init__(self, head = None):
self.head = head
對連結串列的操作包括插入節點,刪除節點,遍歷結點並輸出和連結串列反轉
插入節點
#插入結點函式:引數明確要插入的結點和插入的位置
def insert(self, node, index):
if self.head == None:
self.head = node
return
if index == 0:
node.nextNode = self.head
self.head = node
return
currentNode = self.head
count = 0
# 當前節點後移
while currentNode.nextNode != None and count < index-1:
currentNode = currentNode.nextNode
count+=1
# 插入節點的下一節點時當前節點的下一節點,當前節點的下一節點變成插入節點
if count == index-1:
node.nextNode = currentNode.nextNode
currentNode.nextNode = node
graph LR;
A((a))-->B((b));
B((b))-.->C ((c));
C((c))-->D((d));
B((b))-->|nextNode|E((e))
E((e))-->|nextNode|C((c))
刪除節點
#刪除節點函式:引數標識刪除的節點位置
def delete_node(self, index):
if self.head == None:
return
currentNode = self.head
count = 0
if index == 0:
self.head = None
return
# 當前節點後移
while currentNode.nextNode != None and count < index-1:
currentNode = currentNode.nextNode
count+=1
# 暫存被刪節點(當前節點的下一節點),當前節點的下一節點變成被刪節點的下一節點
if count == index-1:
deleteNode = currentNode.nextNode
currentNode.nextNode = deleteNode.nextNode
graph LR;
A((a))-->B((b));
B((b))-.->C((c));
C((c))-.->D((d));
style C fill:#ccf,stroke:#f66,stroke-width:2px,stroke-dasharray: 5, 5
反轉連結串列
#反轉連結串列函式
def reverse(self):
if self.head == None:
return
currentNode = self.head.nextNode
self.head.nextNode = None
while currentNode != None:
nextNode = currentNode.nextNode #暫存當前節點下一節點為下一節點
currentNode.nextNode = self.head #暫存頭節點為當前節點下一節點
self.head = currentNode #頭節點變成當前節點
currentNode = nextNode # 下一節點變成當前節點
graph LR;
A((head))-.->B((b:cn));
A((head))-->|nextNode|E((None));
B((b:cn))-->|nextNode|C((c:nn->cn));
B((b:cn->head))-->A((head));
C((c:nn->cn))-->D((d))
graph LR;
B((b:head->x))-.->C((c:cn));
C((c:cn->head))-->|nextNode|B((b));
C((c:cn->head))-->|nextNode|D((d));
D((d:nn->cn))-->E((e));
遍歷節點
#遍歷節點函式:輸出所有節點資料
def output(self):
if self.head == None:
return
currentNode = self.head
while currentNode != None:
print(currentNode.data,'--> ',end = "")
currentNode = currentNode.nextNode
print("")