循环链表的python实现

循环链表的python实现

定义

  • 链表的尾节点指向头节点,形成一个环,拥有这种结构的链表称之为循环链表。
  • 循环链表和单链表的操作基本一致,不同点在于算法中的循环条件不一样。
  • 循环链表的优势在于从链表的任意一个节点出发,都能找到任何其他的节点。

用循环链表实现循环队列

  • 由于循环链表,尾的"next"指针指向了头指针,所以我们只需要维护一个指向尾部的指针,暂定位current表示尾节点,那么首节点可通过 current = current.next 来表示,至于为什么current表示的是指向尾节点而不是首节点是因为首节点的next指针仍旧需要遍历整个链表才能得到尾节点的信息。

  • 在循环队列类CircularQueue需要维护三个实例:

    • Q._tail : 用于表示尾节点的引用,当队列为空时为None;
    • Q._size : 用于表示链表的元素个数,即链表的大小;
    • Q.rotate() : 用于实现删除队首的元素以及将此元素插入至队列尾部这两步操作。
  • # !/usr/bin/env python
    # -*-coding:utf-8 -*-
    
    """
    # File       : link_queue_of_python.py
    # Time       :2022/1/10 15:10
    # Author     :kkk
    # version    :python 3.6
    # Description:本文件用于解释如何通过循环链表实现循环队列
    """
    
    
    class Error(Exception):
        pass
    
    
    class LinkQueue(object):
        class Node(object):
            """
            定义节点类
            element实例表示的是初始化的节点与它应当存在的下一节点之间的映射关系,在单链表表示队列的情况下,
            由于新增的队列元素必然是增加在队列的尾端,即单链表的尾节点,那么element是固定为None的
            """
            def __init__(self, element, value):
                self.element = element
                self.value = value
    
        def __init__(self):
            """
            初始化2个实例,以此表示尾节点、队列元素个数
            """
            self._tail = None
            self._size = 0
    
        def is_empty(self):
            return self._size == 0
    
        def first(self):
            if self.is_empty():
                raise Error("the queue is empty")
    
            return self._tail.element.value
    
    
        def enqueue(self, value):
            new_node = self.Node(None, value)
            if self.is_empty():
                self._tail = new_node
                self._tail.element = new_node
            else:
                head_node = self._tail.element
                self._tail.element = new_node
                new_node.element = head_node
            self._size += 1
    
        def dequeue(self):
            if self.is_empty():
                raise Error("the queue is empty")
            value = self._tail.element.value
            if self._size == 1:
                self._tail = None
            else:
                new_element = self._tail.element.element
                self._tail.element = new_element
            self._size -= 1
            return value
    
        def __len__(self):
            return self._size
    
        def rotate(self):
            if not self.is_empty():
                self._tail = self._tail.element
    
    if __name__ == "__main__":
        Q = LinkQueue()
        Q.enqueue(1)
        Q.enqueue(2)
        print(len(Q))
        print(Q.first())
        Q.rotate()
        print(Q.first())
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值