链表
*优快云不支持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("")