设计循环双端队列

题目链接

设计循环双端队列

题目描述

设计循环双端队列_第1张图片
设计循环双端队列_第2张图片

注意

  • 主要是考虑删除头节点和尾节点这两个操作所要使用的存储结构

解答思路

  • 使用链表存储数据,并使用一个字段保存链表的长度

代码

class Node {
    int data;
    Node next;
}

class MyCircularDeque {
    // 头节点,第一个节点的前一个节点
    Node root;
    Node tail;
    int max;
    int len;

    public MyCircularDeque(int k) {
        root = new Node();
        tail = root;
        max = k;
        len = 0;
    }
    
    public boolean insertFront(int value) {
        if(len == max) {
            return false;
        }
        Node node = new Node();
        node.data = value;
        // 此时队列为空
        if(len == 0) {
            root.next = node;
            tail = node;
        } else {
            Node preHead = root.next;
            root.next = node;
            node.next = preHead;
        }
        len++;
        return true;
    }
    
    public boolean insertLast(int value) {
        if(len == max) {
            return false;
        }
        Node node = new Node();
        node.data = value;
        if(len == 0) {
            root.next = node;
        }
        tail.next = node;
        tail = node;
        len++;
        return true;
    }
    
    public boolean deleteFront() {
        if(len == 0) {
            return false;
        }
        root.next = root.next.next;
        len--;
        return true;
    }
    
    public boolean deleteLast() {
        if(len == 0) {
            return false;
        }
        Node node = root;
        int i = 1;
        while(i < len) {
            node = node.next;
            i++;
        }
        node.next = null;
        tail = node;
        len--;
        return true;
    }
    
    public int getFront() {
        return len == 0 ? -1 : root.next.data;
    }
    
    public int getRear() {
        return len == 0 ? -1 : tail.data;
    }
    
    public boolean isEmpty() {
        return len == 0 ? true : false;
    }
    
    public boolean isFull() {
        return len == max ? true : false;
    }
}

/**
 * Your MyCircularDeque object will be instantiated and called as such:
 * MyCircularDeque obj = new MyCircularDeque(k);
 * boolean param_1 = obj.insertFront(value);
 * boolean param_2 = obj.insertLast(value);
 * boolean param_3 = obj.deleteFront();
 * boolean param_4 = obj.deleteLast();
 * int param_5 = obj.getFront();
 * int param_6 = obj.getRear();
 * boolean param_7 = obj.isEmpty();
 * boolean param_8 = obj.isFull();
 */

关键点

  • 使用链表速度肯定比数组快,增加删除数据时不会发生大片数据移动的情况
  • 最初打算使用一个节点保存尾节点的前一个节点以方便删除,但是删除一个节点后无法发现当前节点的上一个节点,最终还是只能用循环实现删除最后一个节点

你可能感兴趣的:(算法,leetcode,算法,数据结构,队列)