【LeetCode】设计数据结构 | List、Stack、Queue、DLinkedList

这篇具有很好参考价值的文章主要介绍了【LeetCode】设计数据结构 | List、Stack、Queue、DLinkedList。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【LeetCode】设计数据结构|List、Stack、Queue、DLinkedList

设计链表(中等)

707. 设计链表

冗余版

class MyLinkedList {
    class ListNode {
        int val;
        ListNode next;
        ListNode(int val) {
            this.val = val;
        }
    }

    int size;
    ListNode dummyHead;

    public MyLinkedList() {
        this.size = 0;
        this.dummyHead = new ListNode(-1);
    }
    
    public int get(int index) {
        if (index + 1 > size) return -1;
        ListNode node = dummyHead.next;
        for (int i = 0; i < index; i++) {
            node = node.next;
        }
        return node.val;
    }
    
    public void addAtHead(int val) {
        ListNode newNode = new ListNode(val);
        newNode.next = dummyHead.next;
        dummyHead.next = newNode;
        size++;
    }
    
    public void addAtTail(int val) {
        ListNode node = dummyHead;
        while (node.next != null) {
            node = node.next;
        }
        node.next = new ListNode(val);
        size++;
    }
    
    public void addAtIndex(int index, int val) {
        ListNode newNode = new ListNode(val);
        ListNode node = dummyHead;
        for (int i = 0; i < index; i++) {
            node = node.next;
            if (node == null) return;
        }
        newNode.next = node.next;
        node.next = newNode;
        size++;
    }
    
    public void deleteAtIndex(int index) {
        if (index < 0 || index >= size) return;
        ListNode node = dummyHead;
        for (int i = 0; i < index; i++) {
            node = node.next;
        }
        ListNode deleteNode = node.next;
        node.next = deleteNode.next;
        // 清除野指针
        deleteNode = null;
        size--;
    }
}

代码复用简化版

class MyLinkedList {
    class ListNode {
        int val;
        ListNode next;
        ListNode(int val) {
            this.val = val;
        }
    }

    int size;
    ListNode dummyHead;

    public MyLinkedList() {
        this.size = 0;
        this.dummyHead = new ListNode(-1);
    }
    
    public int get(int index) {
        if (index + 1 > size) return -1;
        ListNode node = dummyHead.next;
        for (int i = 0; i < index; i++) {
            node = node.next;
        }
        return node.val;
    }
    
    public void addAtHead(int val) {
        this.addAtIndex(0, val);
    }
    
    public void addAtTail(int val) {
        this.addAtIndex(size, val);
    }
    
    public void addAtIndex(int index, int val) {
        ListNode newNode = new ListNode(val);
        ListNode node = dummyHead;
        for (int i = 0; i < index; i++) {
            node = node.next;
            if (node == null) return;
        }
        newNode.next = node.next;
        node.next = newNode;
        size++;
    }
    
    public void deleteAtIndex(int index) {
        if (index < 0 || index >= size) return;
        ListNode node = dummyHead;
        for (int i = 0; i < index; i++) {
            node = node.next;
        }
        ListNode deleteNode = node.next;
        node.next = deleteNode.next;
        // 清除野指针
        deleteNode = null;
        size--;
    }
}

用栈实现队列(简单)

232. 用栈实现队列

class MyQueue {
    Stack<Integer> a;
    Stack<Integer> b;

    public MyQueue() {
        this.a = new Stack<Integer>();
        this.b = new Stack<Integer>();
    }
    
    public void push(int x) {
        a.push(x);
    }
    
    public int pop() {
        if (b.isEmpty()) {
            while (!a.isEmpty()) {
                b.push(a.pop());
            }
        }
        return b.pop();
    }
    
    public int peek() {
        if (b.isEmpty()) {
            while (!a.isEmpty()) {
                b.push(a.pop());
            }
        }
        return b.peek();
    }
    
    public boolean empty() {
        return a.isEmpty() && b.isEmpty();
    }
}

用队列实现栈(简单)

225. 用队列实现栈

方法一:双队列实现

class MyStack {
    Queue<Integer> a;
    Queue<Integer> b;

    public MyStack() {
        this.a = new LinkedList<Integer>();
        this.b = new LinkedList<Integer>();
    }
    
    public void push(int x) {
        while (!a.isEmpty()) {
            b.offer(a.poll());
        }
        a.offer(x);
        while (!b.isEmpty()) {
            a.offer(b.poll());
        }
    }
    
    public int pop() {
        return a.poll();
    }
    
    public int top() {
        return a.peek();
    }
    
    public boolean empty() {
        return a.isEmpty();
    }
}

方法二:单队列实现

class MyStack {
    Queue<Integer> a;

    public MyStack() {
        this.a = new LinkedList<Integer>();
    }
    
    public void push(int x) {
        a.offer(x);
        for (int i = 0; i < a.size() - 1; i++) {
            a.offer(a.poll());
        }
    }
    
    public int pop() {
        return a.poll();
    }
    
    public int top() {
        return a.peek();
    }
    
    public boolean empty() {
        return a.isEmpty();
    }
}

设计循环队列(中等)

622. 设计循环队列

使用数组实现

class MyCircularQueue {
    private int capacity;
    private int front, rear;
    private int[] elements;

    public MyCircularQueue(int k) {
        this.capacity = k + 1;
        this.front = this.rear = 0;
        this.elements = new int[k + 1];
    }
    
    public boolean enQueue(int value) {
        if (isFull()) return false;
        elements[rear] = value;
        rear = (rear + 1) % capacity;
        return true;
    }
    
    public boolean deQueue() {
        if (isEmpty()) return false;
        front = (front + 1) % capacity;
        return true;
    }
    
    public int Front() {
        return isEmpty() ? -1 : elements[front];
    }
    
    public int Rear() {
        return isEmpty() ? -1 : elements[(rear - 1 + capacity) % capacity];
    }
    
    public boolean isEmpty() {
        return rear == front;
    }
    
    public boolean isFull() {
        return (rear + 1) % capacity == front;
    }
}

使用链表实现

class MyCircularQueue {
    class ListNode {
        int val;
        ListNode next;
        ListNode(int val) {
            this.val = val;
        }
    }

    int capacity, size;
    ListNode head, tail;


    public MyCircularQueue(int k) {
        this.size = 0;
        this.capacity = k;
    }
    
    public boolean enQueue(int value) {
        if (isFull()) return false;
        ListNode node = new ListNode(value);
        if (isEmpty()) {
            head = tail = node;
        } else {
            tail.next = node;
            tail = node;
        }
        size++;
        return true;
    }
    
    public boolean deQueue() {
        if (isEmpty()) return false;
        ListNode node = head;
        head = head.next;
        node = null;
        size--;
        return true;
    }
    
    public int Front() {
        return isEmpty() ? -1 : head.val;
    }
    
    public int Rear() {
        return isEmpty() ? -1 : tail.val;
    }
    
    public boolean isEmpty() {
        return size == 0;
    }
    
    public boolean isFull() {
        return size == capacity;
    }
}

设计循环双端队列(中等)

641. 设计循环双端队列

方法一:数组实现

class MyCircularDeque {
    private int capacity;
    private int front, rear;
    private int[] elements;

    public MyCircularDeque(int k) {
        this.capacity = k + 1;
        this.front = this.rear = 0;
        this.elements = new int[k + 1];
    }
    
    public boolean insertFront(int value) {
        if (isFull()) return false;
        front = (front - 1 + capacity) % capacity;
        elements[front] = value;
        return true;
    }
    
    public boolean insertLast(int value) {
        if (isFull()) return false;
        elements[rear] = value;
        rear = (rear + 1 + capacity) % capacity;
        return true;
    }
    
    public boolean deleteFront() {
        if (isEmpty()) return false;
        front = (front + 1) % capacity;
        return true;
    }
    
    public boolean deleteLast() {
        if (isEmpty()) return false;
        rear = (rear - 1 + capacity) % capacity;
        return true;
    }
    
    public int getFront() {
        return isEmpty() ? -1 : elements[front];
    }
    
    public int getRear() {
        return isEmpty() ? -1 : elements[(rear - 1 + capacity) % capacity];
    }
    
    public boolean isEmpty() {
        return front == rear;
    }
    
    public boolean isFull() {
        return (rear + 1) % capacity == front;
    }
}

方法二:链表实现

class MyCircularDeque {
    class DLinkedNode {
        int val;
        DLinkedNode prev;
        DLinkedNode next;
        DLinkedNode (int val) {
            this.val = val;
        }
    }

    private int size, capacity;
    private DLinkedNode dummyHead, dummyTail;

    public MyCircularDeque(int k) {
        this.size = 0;
        this.capacity = k;
        // 设置一个虚的头结点和尾节点
        this.dummyHead = new DLinkedNode(-1);
        this.dummyTail = new DLinkedNode(-1);
        this.dummyHead.next = this.dummyTail;
        this.dummyTail.prev = this.dummyHead;
    }
    
    public boolean insertFront(int value) {
        if (isFull()) return false;
        DLinkedNode node = new DLinkedNode(value);
        node.next = dummyHead.next;
        node.prev = dummyHead;
        dummyHead.next.prev = node;
        dummyHead.next = node;
        size++;
        return true;
    }
    
    public boolean insertLast(int value) {
        if (isFull()) return false;
        DLinkedNode node = new DLinkedNode(value);
        node.next = dummyTail;
        node.prev = dummyTail.prev;
        dummyTail.prev.next = node;
        dummyTail.prev = node;
        size++;
        return true;
    }
    
    public boolean deleteFront() {
        if (isEmpty()) return false;
        DLinkedNode node = dummyHead.next;
        node.next.prev = dummyHead;
        dummyHead.next = node.next;
        node = null;
        size--;
        return true;
    }
    
    public boolean deleteLast() {
        if (isEmpty()) return false;
        DLinkedNode node = dummyTail.prev;
        node.next.prev = node.prev;
        node.prev.next = node.next;
        node = null;
        size--;
        return true;
    }
    
    public int getFront() {
        return isEmpty() ? -1 : dummyHead.next.val;
    }
    
    public int getRear() {
        return isEmpty() ? -1 : dummyTail.prev.val;
    }
    
    public boolean isEmpty() {
        // return dummyHead.next == dummyTail;
        // return dummyTail.prev == dummyHead;
        return size == 0;
    }
    
    public boolean isFull() {
        return size == capacity;
    }
}

设计前中后队列(中等)

1670. 设计前中后队列文章来源地址https://www.toymoban.com/news/detail-623880.html

class FrontMiddleBackQueue {
    // 保持  leftQueue.size() == rightQueue.size()
    //  or  leftQueue.size() + 1 == rightQueue.size()
    // 注意中位数是按进入数字流中的数字的先后顺序来看的(别搞反啦!!!)
    private LinkedList<Integer> leftQueue;
    private LinkedList<Integer> rightQueue;

    public FrontMiddleBackQueue() {
        leftQueue  = new LinkedList<Integer>();
        rightQueue = new LinkedList<Integer>();
    }
    
    public void pushFront(int val) {
        if (leftQueue.size() == rightQueue.size()) {
            rightQueue.offerFirst(val);
        } else {
            leftQueue.offerFirst(rightQueue.pollLast());
            rightQueue.offerFirst(val);
        }
    }
    
    public void pushMiddle(int val) {
        if (rightQueue.isEmpty()) {
            rightQueue.offerLast(val);
        } else if (leftQueue.size() == rightQueue.size()) {
            rightQueue.offerLast(val);
        } else {
            leftQueue.offerFirst(rightQueue.pollLast());
            rightQueue.offerLast(val);
        }
    }
    
    public void pushBack(int val) {
        leftQueue.offerLast(val);
        if (leftQueue.size() > rightQueue.size()) {
            rightQueue.offerLast(leftQueue.pollFirst());
        }
    }
    
    public int popFront() {
        if (rightQueue.isEmpty()) return -1;
        int val = rightQueue.pollFirst();
        if (leftQueue.size() > rightQueue.size()) {
            rightQueue.offerLast(leftQueue.pollFirst());
        }
        return val;
    }
    
    public int popMiddle() {
        if (rightQueue.isEmpty()) return -1;
        int val = rightQueue.pollLast();
        if (leftQueue.size() > rightQueue.size()) {
            rightQueue.offerLast(leftQueue.pollFirst());
        }
        return val;
    }
    
    public int popBack() {
        if (rightQueue.isEmpty()) return -1;
        if (leftQueue.size() < rightQueue.size()) {
            leftQueue.offerFirst(rightQueue.pollLast());
        }
        return leftQueue.pollLast();
    }
}

到了这里,关于【LeetCode】设计数据结构 | List、Stack、Queue、DLinkedList的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构与算法】6、栈(Stack)的实现、LeetCode:有效的括号

    🌱 栈 是一种特殊的线性表, 只能在一端进行操作 🌱 往栈中 添加 元素的操作,一般叫做 push ( 入栈 ) 🌱 从栈中 移除 元素的操作,一般叫做 pop ,出栈(只能移除栈顶元素),也叫做: 弹出栈顶元素 🌱 后进先出 的原则, L ast I n F irst O ut, LIFO 注意:这里的 栈 与内

    2024年02月13日
    浏览(25)
  • STL——stack容器、queue容器、list容器

    就是栈 栈不允许有遍历行为 是先进后出的数据结构 是先进先出的数据结构 **队列容器允许从一端新增元素,从另一端移除元素 队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为 队列中进数据称为—入队push 队列中出数据称为—出队pop ** 在STL中这个链表

    2024年02月09日
    浏览(25)
  • C++基础(13)——STL(stack、queue、list)

    本文主要介绍C++中STL中的stack、queue和list容器 栈中只有顶端元素才可以被外界调用,因此栈不允许有遍历的行为,其中string、vector、deque都可以遍历 队列中队头出数据,队尾进数据,且和栈一样不允许有遍历操作 queue容器装入自定义数据类型数据 链表由一系列的结点组成,结

    2024年02月10日
    浏览(26)
  • 【LeetCode】数据结构题解(13)[设计循环链表]

    所属专栏:玩转数据结构题型❤️ 🚀 博主首页:初阳785❤️ 🚀 代码托管:chuyang785❤️ 🚀 感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️ 🚀 博主也会更加的努力,创作出更优质的博文!!❤️ 🚀 关注我,关注我,关注我,重要的事情说三遍!!!!!

    2024年02月13日
    浏览(41)
  • 【数据结构】如何设计循环队列?图文解析(LeetCode)

    LeetCode链接:622. 设计循环队列 - 力扣(LeetCode) 目录 做题思路 只开辟 k 个空间 多开一个空间 代码实现 1. 循环队列的结构 2. 开辟空间 3. 判断空 4. 判断满 5. 队尾插入数据 6. 队头删除数据 7. 获取队头元素 8. 获取队尾元素 9. 销毁队列 全部代码 设计循环队列,使用数组或链表

    2024年02月10日
    浏览(29)
  • 【LeetCode: 155. 最小栈 + 栈 + 数据结构设计】

    🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文

    2024年02月22日
    浏览(30)
  • 数据结构:循环队列的实现(leetcode622.设计循环队列)

      目录 一.循环队列简单介绍 二.用静态数组实现循环队列 1.数组循环队列结构设计 2.数组循环队列的堆区内存申请接口  3.数据出队和入队的接口实现 4.其他操作接口 5.数组循环队列的实现代码总览  三.静态单向循环链表实现循环队列  1.链表循环队列的结构设计 2.创建静态

    2024年02月03日
    浏览(27)
  • 【数据结构】队列-Queue

    ⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈数据结构 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 队列: 只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(FirstIn First Out) 入队列:

    2024年02月08日
    浏览(32)
  • 数据结构:队列Queue详解

    队列 :只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表。进行插入操作的一端称为 队尾 ,删除操作的一端称 队头 。 入队列 :进行插入操作的一端称为 队尾 。 出队列 :进行删除操作的一端称为 队头 。 在 Java 中, Queue是个接口,底层是通过链表

    2024年02月11日
    浏览(28)
  • 数据结构之Queue的实现

    方法名 参数 功能 返回 Size void 返回链表规模(该方法由List T派生而来) empty void 返回链表是否为空(该方法由List T派生而来) front void 返回队首数据域的引用 enqueue T const e 入队 void dequeue void 出队 出队的对象

    2024年02月15日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包