什么是基于单链表的数据结构,以使Enqueue和Dequeue都采用O1?

问题描述

结构如何实现基于简单链接列表的抽象数据类型文件,以使ENQUEUE和DEQUEUE过程位于O(1)中? 约束:实现队列的结构只能由单个字段指向(例如:头,尾或元素数等)

我的理解是从头到尾分发单链列表。

但是即使在这种情况下,仍然需要两个指针:满足O(1)的头和尾。

但是,这个问题要求队列只能由一个字段指向。

有任何想法或提示吗?

解决方法

我认为这对于循环链接列表是可行的,其中您指向 tail ,因此您可以以tail.next的形式访问O(1)中的头部。

class Node<T> {
  T value;
  Node<T> next;
  Node(T value,Node<T> next) { this.value = value; this.next = next; }
}
class Queue<T> {
  Node<T> tail = null;
  void enqueue(T t) {
    if (tail == null) {
      tail = new Node<T>(value,null);
      tail.next = tail;
    } else {
      Node<T> newTail = new Node<T>(value,tail.next);
      tail.next = newTail;
      tail = newTail;
    }
  }
  T dequeue() {
    if (tail == null) throw new NoSuchElementException();
    Node<T> head = tail.next;
    T result = head.value;
    if (head == tail) {
      tail = null;
    } else {
      tail.next = head.next;
    }
    return result;
  }
}