循环链表的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())