数据结构三:python实现简单的单向循环链表

单向循环链表只有对头结点和尾部结点有增删操作的时候跟单向链表不同

这里继承了之前的单向链表的类

实现代码:

from node import BaseNode
from single_linked_list import SingleLinkedList


class OneAwayLoopLinkedList(SingleLinkedList):
    """单向循环链表"""

    def length(self):
        # 如果链表为空
        if not self.head:
            return 0
        # 获取头结点的下一个结点
        node = self.head.next
        # 用于记录链表的长度
        length = 1
        # 如果当前结点不等于头结点
        while node != self.head:
            # 长度加1
            length += 1
            # 将当前结点指向下一个结点
            node = node.next
        # 返回链表的长度
        return length

    def __str__(self):
        """
        打印实例时的输出
        :return:
        """
        # 获取头结点
        node = self.head
        travel = "["
        while node:
            if node == self.head:
                travel += str(node.item)
            else:
                travel += ", %r" % node.item
            node = node.next
            if node.next == self.head:
                if node != self.head:
                    travel += ", %r" % node.item
                break
        return travel + "]"

    def add(self, item):
        """从头部添加结点"""
        # 创建结点
        new_node = BaseNode(item)
        if not self.head:
            new_node.next, self.head = new_node, new_node
        else:
            node = self.head
            while node.next != self.head:
                node = node.next
            node.next, new_node.next, self.head = new_node, self.head, new_node

    def append(self, item):
        """从尾部添加"""
        # 创建结点
        new_node = BaseNode(item)
        # 如果链表为空
        if not self.head:
            # (和从头部添加一样)
            self.add(item)
        else:
            # 获取头部结点
            node = self.head
            # 获取尾部结点
            while node.next != self.head:
                node = node.next
            node.next, new_node.next = new_node, self.head

    def remove(self, item):
        """
        根据值移除结点
        只有删除头部的时候跟单向链表不同
        """
        if self.head:
            # 获取头结点
            node = self.head
            # 如果头结点即是要删除的结点
            if node.item == item:
                if self.length() == 1:
                    self.clear()
                    return
                while node.next != self.head:
                    node = node.next
                self.head, node.next = self.head.next, self.head.next
                # self.head, node.next = self.head.next, self.head
                return
            while node.next != self.head:
                # 如果当前结点的下一个结点是要删除的结点
                if node.next.item == item:
                    node.next = node.next.next
                    return
                node = node.next
        # 如果以上条件都不满足 则说明值不在链表内
        raise ValueError('item not in SingleLinkedList')

    def search(self, item):
        """查询值item是否在链表中"""
        if self.is_empty():
            return False
        # 获取头结点
        node = self.head
        if node.item == item:
            return True
        while node.next != self.head:
            if node.next.item == item:
                return True
            node = node.next
        return False

猜你喜欢

转载自blog.csdn.net/qq_41864652/article/details/81190437