Python实现基础数据结构--单向链表

链表

*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("")

猜你喜欢

转载自blog.csdn.net/YPJMFC/article/details/79547287
今日推荐