小工具知识网

当前位置: 首页 > 行业知识 > 手撕Java集合之简易版Deque(LinkedList)

行业知识

手撕Java集合之简易版Deque(LinkedList)

2026-11-03 00:18:57 来源:互联网转载

在���前,许多互联网公司的面试已经要求能手撕集合源码,集合源码本身算是源码里比较简单的一部分,但是要在面试极短的10来分钟内快速写出一个简易版的源码还是比较麻烦的,很容易出现各种小问题。所以在平时就要注重这方面的联系。

以下是我自己写的一个简易双端队列,我没有实现List接口,因为里面要实现的函数方法太多了,所以只是挑了几个核心的代码来写,本质其实就是头插法和尾插法的结合。

代码主要有三个文件,分别是Node节点,Deque类和测试文件。

Node:

package org.example.collection;import lombok.Data;import java.util.HashMap;import java.util.Map;@Datapublic class Node {    T var;    Node prev;    Node next;    Node(Node prev,T element, Node next){        this.var = element;        this.next = next;        this.prev = prev;    }}

Deque实现文件:

package org.example.collection;public class DequeCode{    int size = 0;    Node first;    Node last;    public DequeCode() {        this.first = new Node(null,null,null);        this.last = new Node(null,null,null);        //first和last之间应该建立联系        first.next = last;        last.prev = first;    }    public int size() {        return size;    }    public void addFirst(E element){        //采用头插法来进行双端的插入        Node node = new Node(null,element,null);        size++;        if(first.next==null){            first.next = node;            node.prev = first;            return ;        }        Node temp = first.next;        first.next = node;        node.prev = first;        node.next = temp;        temp.prev = node;    }    public void addLast(E element){        //和头插入相同的思路        Node node = new Node(null,element,null);        Node temp = last.prev;        size++;        if(last.prev==null){            last.prev = node;            node.next = last;            return ;        }        last.prev = node;        node.next = last;        temp.next = node;        node.prev = temp;    }    public void removeFirst() throws Exception {        if(size == 0) throw new Exception("出现问题");        Node node = first.next;        first.next = first.next.next;        node.next.prev = first;    }    public void removeLast() throws Exception {        if(size == 0) throw new Exception("出现问题");        Node node = last.prev;        last.prev = last.prev.prev;        node.prev.next = last;    }    public Node peekFirst(){        return first.next;    }    public Node peekLast(){        return last.prev;    }}

最后是测试文件:

package org.example.collection;public class TestDeque {    public static void main(String[] args) throws Exception {        DequeCode deque = new DequeCode();        deque.addFirst(1);        deque.addLast(2);        System.out.println(deque.peekFirst().var);        System.out.println(deque.peekLast().var);        deque.addFirst(3);        deque.addLast(4);        System.out.println(deque.peekFirst().var);        System.out.println(deque.peekLast().var);        deque.removeFirst();        deque.removeLast();        System.out.println(deque.peekFirst().var);        System.out.println(deque.peekLast().var);    }}

结果和预期一致

代码逻辑很简单,但是细节方面仍有很大的提升空间。但是面试时间短,这些代码能在10来分钟无失误写出,想来也是够用了。

上一篇:宝塔控制面板使用秘籍,轻松上手,一键管理,助力高效运维!

下一篇:服务器怎么查看电源设置?