python 实现链表的代码

http://【菜鸟利用python实现了链表的创建以及增加链表的节点,你要不要来看看?】 https://www.bilibili.com/video/BV1qM411v7Ci/?share_source=copy_web&vd_source=b11ebfafd5976cd30713421804a55f6c 这是自己实现的链表代码,注释比较清楚,如果还是不懂的可以去观看我录制的视频,有疑问欢迎下方留言。

class Node:
    def __init__(self,val):
        self.val = val
        self.next = None

class Link_Node:
    def __init__(self):
        self.head = Node(None) # 表示头结点为空  在本代码中的头结点直接作为指针   不包含任何数据

    # 在链表的前面加上节点
    def add_Node_head(self,data):
        data_Node = Node(data) # 将读进的数据变成节点
        # 将节点放在最前面
        # 如果本身就是空链表,那么直接返回输入的节点
        # if self.head == None:
        #     self.head.next = data_Node
        #     return self.head
        # 如果不是空链表
        # 第一种情况是在链表的前面加
        data_Node.next = self.head.next
        self.head.next = data_Node
        return self.head

    def add_Node_tail(self,data):
        data_Node = Node(data)
        # 在链表的尾部加上节点
        temp = self.head
        while temp.next:
            temp = temp.next
        temp.next = data_Node

    def add_Node_middle(self,data,location):
        data_Node = Node(data)
        # 如果增加的位置已经超过本身链表的长度,我们就直接调用尾插的方法
        # 我们将头结点当做第0个位置
        number = 0
        temp = self.head
        while temp.next:
            number = number + 1
            temp = temp.next
        temp = self.head  # 此时要把临时指针指到链表的头结点,这是下面的代码需要
        if number <= location - 1: # 表示链表的长度小于节点本身
            while temp.next:
                temp = temp.next
            temp.next = data_Node
        else:
            for _ in range(location):
                temp = temp.next
            data_Node.next = temp.next
            temp.next = data_Node

    def delate_end(self,head):
        if head.next == None:
            head = None # 将head变成空
            print("没有节点 不能删除")
        # 删除的是最后一个节点
        # 必须需要两个节点才能进行删除最后一个节点
        pre_Node = head
        temp = pre_Node.next
        while temp.next:
            pre_Node = pre_Node.next
            temp = pre_Node.next
        pre_Node.next = None

    def delate_middle(self, head,location):
        # 删除中间的指定元素
        number = 0
        pre_Node = head
        temp = pre_Node.next
        while pre_Node.next:
            number = number + 1
            pre_Node = pre_Node.next
        pre_Node = head  # 此时要把临时指针指到链表的头结点,这是下面的代码需要
        if number <= location - 1:  # 表示链表的长度小于节点本身
            while temp.next:
                pre_Node = pre_Node.next
                temp = pre_Node.next
            pre_Node.next = None
        else:
            # 删除的是中间的链表节点
            for _ in range(location):
                pre_Node = pre_Node.next
                temp = pre_Node.next
            pre_Node.next = temp.next

    def print(self,head):
        # 用于打印每个节点的值
        temp = head
        while temp.next:
            print(temp.next.val,end="-->")
            temp = temp.next

link_node = Link_Node()
link_node.add_Node_head(1)
link_node.add_Node_head(2)
link_node.add_Node_head(3)
link_node.add_Node_head(4)
link_node.add_Node_head(6)
link_node.add_Node_head(5)
print("-----------------------------------在链表的前面增加节点打印输出------------------------------",end="\n")
link_node.print(link_node.head)
link_node.add_Node_tail(30)
link_node.add_Node_tail(0)
print("\n")
print("-----------------------------------在链表的后面增加节点打印输出------------------------------")
link_node.print(link_node.head)

link_node.add_Node_middle(66,100)
print("\n")
print("-----------------------------------在链表的中间增加节点,但是位置超过链表的长度------------------------------")
link_node.print(link_node.head)


print("\n")
print("-----------------------------------在链表的后面增加节点打印输出,位置在链表的里面------------------------------")

link_node.add_Node_middle(77,4)
link_node.print(link_node.head)

print("\n")
print("-----------------------------------删除链表中的最后一个元素------------------------------")

link_node.delate_end(link_node.head)
link_node.print(link_node.head)


print("\n")
print("-----------------------------------删除链表中的中间的一个元素,但是超过了表的最大长度------------------------------")

link_node.delate_middle(link_node.head,100)
link_node.print(link_node.head)


print("\n")
print("-----------------------------------删除链表中的中间的一个元素,但是未超过了表的最大长度------------------------------")

link_node.delate_middle(link_node.head,3)
link_node.print(link_node.head)

猜你喜欢

转载自blog.csdn.net/weixin_44911037/article/details/128944446