Python实现单向循环链表的封装

单向循环链表

单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。
在这里插入图片描述

单向循环链表的操作和代码实现

单向循环链表的操作和单向链表的一样,只不过末尾节点的next指向了head,进行有些操作时的判断条件发生了改变。
在这里插入图片描述
还是和之前一样,我们先进行节点的声明和链表长度,是否为空的代码实现:

class Node(object):
    """节点封装"""
    def __init__(self, element):
        self.element = element
        self.next = None

class LoopSingleLink(object):
    """单向循环链表封装"""
    def __init__(self):
        self._head = None

    def is_empty(self):
        return  self._head == None

    def __len__(self):
        if self.is_empty():
            return 0
        else:
            length = 1
            cur = self._head
            while cur.next != self._head:
                length += 1
                cur = cur.next
            return length

    def travel(self):
        """遍历链表"""
        if self.is_empty():
            print('空链表')
        else:
            cur = self._head
            while cur.next != self._head:
                print(cur.element, end=',')
                cur = cur.next
            print(cur.element, end=',')

头部添加元素

    def add(self, item):
        """头部添加元素"""
        node = Node(item)
        if self.is_empty():
            self._head = node
            node.next = self._head
        else:
            # 添加的节点指向_head
            node.next = self._head
            # 移动到链表末尾,将尾部节点的next指向node
            cur = self._head
            while cur.next != self._head:
                cur = cur.next
            cur.next = node
            # _head指向node
            self._head = node

尾部添加元素

    def append(self, item):
        """尾部添加元素"""
        node = Node(item)
        if self.is_empty():
            self._head = node
            node.next = self._head
        else:
            cur = self._head
            while cur.next != self._head:
                cur = cur.next
            # 将尾节点指向node
            cur.next = node
            # 将添加节点的next指向_head
            node.next = self._head

指定位置添加元素

    def insert(self, index, item):
        """指定位置添加元素"""
        if index <= 0:
            self.add(item)
        elif index >= self.__len__():
            self.append(item)
        else:
            # 中间位置添加元素
            cur = self._head
            count = 0
            node = Node(item)
            while count < index-1:
                count += 1
                cur = cur.next
            node.next = cur.next
            cur.next = node

删除指定元素

    def remove(self, item):
        """删除指定元素的节点"""
        """
            分为三种情况:
                1. 删除头部,需要更改_head和尾节点next指向的头部_head
                2. 删除尾部,更改尾节点前一个节点的next指向_head
                3. 删除中间位置,
        """
        cur = self._head
        pre = None
        while cur.next != self._head:
            if cur.element == item:
                # 如果是头节点
                if not pre:
                    # 寻找最后一个节点,将next指向新的_head
                    rear = self._head
                    while rear.next != self._head:
                        rear = rear.next
                    self._head = cur.next
                    # 指定头部为当前节点的下一个节点
                    rear.next = self._head
                # 为中间节点
                else:
                    # 将删除位置的上一个节点指向删除节点的下一个节点
                    pre.next = cur.next
                break
            else:
                pre = cur
                cur = cur.next

查找元素在链表中是否存在

    def search(self, item):
        """查找指定元素节点是否存在"""
        if self.is_empty():
            return False
        cur = self._head
        # 判断除了最后一个节点是否等于item
        while cur.next != self._head:
            if cur.element == item:
                return True
            cur = cur.next
        # 判断最后一个节点是否为item
        if cur.element == item:
            return True

        return False

测试代码

if __name__ == '__main__':
    link = LoopSingleLink()
    # link.add(3)
    # print(link.travel())
    # link.append(1)
    # link.append(2)
    # print(link.travel())
    print("链表是否为空?", link.is_empty())
    print(link.__len__())
    # link.insert(1, 'hello')
    # print(link.travel())
    # link.remove(3)
    # print(link.travel())
    # print(link.search('hello'))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值