当前位置: 首页 > news >正文

手撕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来分钟无失误写出,想来也是够用了。

http://www.lryc.cn/news/309794.html

相关文章:

  • MySQL知识点归纳总结(二)
  • vue:实现顶部消息横向滚动通知
  • [笔记] wsl 禁用配置 win系统环境变量+代理
  • Mysql标量子查询
  • 深入了解Java虚拟机(JVM)
  • Image Fusion via Vision-Language Model【文献阅读】
  • 探索Manticore Search:开源全文搜索引擎的强大功能
  • AI 笔记助手,你的思路整理助手
  • EchoServer回显服务器简单测试
  • 车灯修复UV胶的优缺点有哪些?
  • 探讨倒排索引Elasticsearch面试与实战:从理论到实践
  • 网安入门18-XSS(靶场实战)
  • 爬虫的一些小技巧总结
  • LeetCode---386周赛
  • React之数据绑定以及表单处理
  • Siamrpn++论文中文翻译(详细!)
  • 第一篇【传奇开心果系列】Python的自动化办公库技术点案例示例:深度解读Pandas库
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的停车位检测系统(Python+PySide6界面+训练代码)
  • 状态模式(State Pattern)
  • js之版本号排序
  • 考取ORACLE数据库OCP的必要性 Oracle数据库
  • WordPress通过宝塔面板的入门安装教程【保姆级】
  • Leetcoder Day25| 回溯part05:子集+排列
  • 【HTML】HTML基础5(特殊字符)
  • MacBook将iPad和iPhone备份到移动硬盘
  • 贪心 Leetcode 376 摆动序列
  • 蓝桥杯(3.1)
  • 像用Excel一样用Python:pandasGUI
  • C#面:Application , Cookie 和 Session 会话有什么不同
  • BUUCTF---数据包中的线索1