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

在目前,许多互联网公司的面试已经要求能手撕集合源码,集合源码本身算是源码里比较简单的一部分,但是要在面试极短的10来分钟内快速写出一个简易版的源码还是比较麻烦的,很容易出现各种小问题。所以在平时就要注重这方面的联系。
以下是我自己写的一个简易双端队列,我没有实现List接口,因为里面要实现的函数方法太多了,所以只是挑了几个核心的代码来写,本质其实就是头插法和尾插法的结合。
代码主要有三个文件,分别是Node节点,Deque类和测试文件。
Node:

package org.example.collection;

import lombok.Data;

import java.util.HashMap;
import java.util.Map;

@Data
public class Node<T> {
    T var;
    Node<T> prev;
    Node<T> next;

    Node(Node<T> prev,T element, Node<T> next){
        this.var = element;
        this.next = next;
        this.prev = prev;
    }

}

Deque实现文件:

package org.example.collection;

public class DequeCode<E>{
    int size = 0;
    Node<E> first;
    Node<E> last;
    public DequeCode() {
        this.first = new Node<E>(null,null,null);
        this.last = new Node<E>(null,null,null);
        //first和last之间应该建立联系
        first.next = last;
        last.prev = first;
    }
    public int size() {
        return size;
    }

    public void addFirst(E element){
        //采用头插法来进行双端的插入
        Node<E> node = new Node<>(null,element,null);
        size++;
        if(first.next==null){
            first.next = node;
            node.prev = first;
            return ;
        }
        Node<E> temp = first.next;
        first.next = node;
        node.prev = first;
        node.next = temp;
        temp.prev = node;
    }
    public void addLast(E element){
        //和头插入相同的思路
        Node<E> node = new Node<>(null,element,null);
        Node<E> 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<E> node = first.next;
        first.next = first.next.next;
        node.next.prev = first;
    }
    public void removeLast() throws Exception {
        if(size == 0) throw new Exception("出现问题");
        Node<E> node = last.prev;
        last.prev = last.prev.prev;
        node.prev.next = last;
    }
    public Node<E> peekFirst(){
        return first.next;
    }
    public Node<E> peekLast(){
        return last.prev;
    }
}

最后是测试文件:

package org.example.collection;

public class TestDeque {
    public static void main(String[] args) throws Exception {
        DequeCode<Integer> 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来分钟无失误写出,想来也是够用了。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值