实现单链表和循环链表

单链表是一种线性数据结构,特点是:(1) .分配空间是不需要一块大的内存空间,因为每个节点都可以独立存储;

                                                              (2) .从最后添加一个节点的时间复杂度为 O(1) , 增删查找操作的时间复杂度都为O(n)

节点类 :   

class Node :
    def __init__(self):
        self.value = None
        self.next_node = None

链表的初始化方法 : 

    def __init__(self):

        self.head = None
        self.end = None
        self.next_node = None
        self.length = 0

从链表尾部添加一个元素add 方法: 这里用了 end 这个尾结点,使得每次添加的时间复杂度为 O(1),而不需要每次都需要从表头走到表尾

    def add(self,value):
        """从尾部添加一个元素"""

        new_node = Node()
        new_node.value = value
        if self.head == None:
            self.head = new_node
            self.next_node =self.head
        if self.end == None :
            self.end = new_node
            self.head.next_node = new_node
        else:
            self.end.next_node = new_node
            self.end = new_node
        self.length += 1

从给定值得后面添加一个元素 insert 方法

    def insert(self,node_value,value):
        """在某个元素后面插入一个元素,
            如果node_value 没有在链表中,就返回 -1
            插入成功 ,返回True
        """
        new_node = Node()
        new_node.value = value
        next = self.head
        while (next.value != node_value):
            if next == self.end :
                return -1
            next = next.next_node
        new_node.next_node = next.next_node
        next.next_node = new_node
        self.length += 1
        return True

删除给定值得节点 remove 方法 

    def remove(self,value):
        """删除给定值得节点"""

        next = self.head
        prev = None
        while (next.value != value):
            prev = next
            next = next.next_node
            if next == None :
                return True
        self.length -= 1
        prev.next_node = next.next_node

修改值 update 方法

    def update(self,old , new):
        """
        修改第一个找到的值为old的节点的值为new

        :param old: 要修改的节点的值
        :param new: 节点新的值
        :return: -1 : 在链表中没有找到值为 old 的节点
                True : 修改成功
        """
        next = self.head
        while (next.value != old):
            next = next.next_node
            if next.next_node == None :
                return -1
        next.value = new
        return True

查找给定值在链表中的索引  getIndex 

    def getIndex(self,value):
        """
        查找给定值在链表中的索引
        :param value:
        :return: -1 : 给定的值不在列表中
                0 ~ length :找到给定值得索引
        """

        next = self.head
        index = 0
        while(next.value != value):
            next = next.next_node
            index += 1
            if next == None :
                return -1
        return index

查找给定值得索引 getValue

    def getValue(self,index):
        """
        根据给定的索引返回改索引的值
        :param index:
        :return:
        """
        if index > self.length or index < 0:
            return -1
        next = self.head
        temp_index = 0
        while(temp_index<index):
            next = next.next_node
        return next.value

使用 __iter__ 和 __next__ 方法使链表为可迭代对象 

    def __iter__(self):

        return self

    def __next__(self):

        this_node = self.next_node
        if this_node != None :
            self.next_node = self.next_node.next_node
            return this_node
        else:
            raise StopIteration

循环链表是单链表的简单变形,把链表的尾节点和头结点连接到一起,操作的时候,边界判定不是下一个节点为null,而是下一个节点为头结点的时候

class CircleLink :

    def __init__(self):

        self.head = None
        self.next_node = None
        self.length = 0


    def add(self,value):
        """从尾部添加一个元素"""

        new_node = Node()
        new_node.value = value
        if self.head == None:
            self.head = new_node
            self.next_node =self.head
        next = self.head
        while(next.next_node != self.head):
            next = next.next_node
        next.next_node = new_node
        new_node.next_node = self.head
        self.length += 1

    def insert(self,node_value,value):
        """在某个元素后面插入一个元素,
            如果node_value 没有在链表中,就返回 -1
            插入成功 ,返回True
        """
        new_node = Node()
        new_node.value = value
        next = self.head
        while (next.value != node_value):
            if next.next_node == self.head :
                return -1
            next = next.next_node
        new_node.next_node = next.next_node
        next.next_node = new_node
        self.length += 1
        return True


    def remove(self,value):
        """删除给定值得节点"""

        next = self.head
        prev = None
        while (next.value != value):
            prev = next
            next = next.next_node
            if next == self.head :
                return True
        self.length -= 1
        prev.next_node = next.next_node

    def update(self,old , new):
        """
        修改第一个找到的值为old的节点的值为new

        :param old: 要修改的节点的值
        :param new: 节点新的值
        :return: -1 : 在链表中没有找到值为 old 的节点
                True : 修改成功
        """
        next = self.head
        while (next.value != old):
            next = next.next_node
            if next.next_node == self.head :
                return -1
        next.value = new
        return True

    def getIndex(self,value):
        """
        查找给定值在链表中的索引
        :param value:
        :return: -1 : 给定的值不在列表中
                0 ~ length :找到给定值得索引
        """

        next = self.head
        index = 0
        while(next.value != value):
            next = next.next_node
            index += 1
            if next == self.head :
                return -1
        return index

    def getValue(self,index):
        """
        根据给定的索引返回改索引的值
        :param index:
        :return:
        """
        if index > self.length or index < 0:
            return -1
        next = self.head
        temp_index = 0
        while(temp_index<index):
            next = next.next_node
        return next.value


    def __iter__(self):

        return self

    def __next__(self):

        this_node = self.next_node
        if this_node != self.head :
            self.next_node = self.next_node.next_node
            return this_node
        else:
            raise StopIteration

    def __len__(self):
        return self.length

 


版权声明:本文为weixin_41789943原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。