线性表的链式存储(python实现)

1.定义

将线性表L=(a0,a1,……,an-1)中各元素分布在存储器的不同存储块,称为结点,每个结点(尾节点除外)中都持有一个指向下一个节点的引用,这样所得到的存储结构为链表结构。

2.特点

 >逻辑上相邻的元素 ai, ai+1,其存储位置也不一定相邻;
 >存储稀疏,不必开辟整块存储空间。
>对表的插入和删除等运算的效率较高。
>逻辑结构复杂,不利于遍历。

3.代码实现

 (链表的增删改查)

"""
功能∶实现单链表的构建和功能操作重点代码

"""
#创建节点类
class Node:
    """
    思路∶将自定义的类视为节点的生成类,实例对象中
    包含数据部分和指向下一个节点的n e x t

    """
    def __init__ (self,val, next=None):
        self.val = val     #有用数据
        self.next = next   #循环下一个节点关系


class LinkListManager:
    def __init__(self):
        """
        初始化链表﹐标记一个链表的开端﹐以便于获取后续的节点

        """
        self.head = Node(None)

    def init_list(self,list_):
        pointer = self.head       #相当于指针,初始指向头部
        for item in list_:
            pointer.next =Node(item)   #将头部的next指向node
            pointer = pointer.next      #指针移动到下一个值

    def show_list(self):
        """
        遍历链表
        :return:
        """
        pointer_value = self.head.next #将指针从头部移动到第一个值
        while pointer_value is not None:
            print(pointer_value.val)
            pointer_value = pointer_value.next #将指针向下移动

    def is_empty(self):
        """
        判断链表是否为空
        :return: bool
        """
        if self.head.next is None:
            return True
        return False

    def clear(self):
        """
        清空链表
        :return:
        """
        self.head.next = None

    def append_end_value(self,value):
        """
        尾部插入
        :return:
        """
        pointer = self.head
        while pointer.next is not None:     #将指针移动到最后的节点上
            pointer= pointer.next
        pointer.next = Node(value)          #在最后的节点上插值

    def append_start_value(self,value):
        """
        头部插入
        :return:
        """
        node = Node(value)     #定义一个节点
        node.next = self.head.next   #将新节点next链接到第一个节点(不算头部)
        self.head.next = node        #将头部节点的next的链接到node

    def count_index(self):
        """
        查看节点数
        :return: 节点数
        """
        count = 0
        pointer = self.head
        while pointer.next is not None:
            count +=1
            pointer = pointer.next
        return count

    def insert_value(self,index,value):
        """
        某个位置插入(按照索引规则从0开始)
        :return:
        """
        if self.count_index() < index:
            self.append_end_value(value)
        elif index < 0:
            self.append_start_value(value)
        else:
            pointer  = self.head
            for i in range(index) :
                pointer = pointer.next #将指针移动到index的前一个节点
            node = Node(value)  # 定义一个节点
            node.next = pointer.next  #
            pointer.next = node  #

    def remove_value(self,value):
        """
        按照值删除节点
        :param value:
        :return:
        """
        pointer = self.head
        while pointer.next and pointer.next.val != value:     #将指针移动到value的前一个节点,若到末尾则停止
            pointer = pointer.next

        if pointer.next is None:      #若到链表末尾,则value不在表中
            raise ValueError("value  not in linklist ")
        else:
            pointer.next = pointer.next.next

    def get_index(self,index):
        """
        根据索引获取值
        :param index: 索引
        :return: 索引对应值
        """
        return self.__get_element(index).val

    def __get_element(self,index):
        """
        根据索引获取对应的节点
        :param index: 索引
        :return: 该节点
        """
        pointer = self.head.next
        if index < 0:
            raise ValueError("index out of range")
        for i in range(index):
            if pointer.next is None:
                raise ValueError("index out of range")
            pointer = pointer.next
        return pointer

    def update(self,index,new_value):
        """
        根据索引修改值
        :param index: 索引
        :param new_value:新值
        :return:
        """
        self.__get_element(index).val = new_value

if __name__ == '__main__':    #测试代码
    manager = LinkListManager()
    manager.init_list([1,2,3,4,5])
    manager.append_end_value(6)
    manager.append_start_value(0)
    print(manager.count_index())
    manager.insert_value(5,88)
    manager.remove_value(88)
    print(manager.get_index(4))
    manager.update(4,8)
    manager.show_list()

 

上一篇:SDN 网络技术系列文章


下一篇:vpp cmd