45 容器(四)——手写LinkedList
概念
LinkedList级双向链表,它的单位是节点,每一个节点都要一个头指针和一个尾指针,称为前驱和后继。第一个节点的头指针指向最后一个节点,最后一个节点的尾指针指向第一个节点,形成环路。
链表增删速度快,查询速度慢。
手写LinkedList
通过今天手写LinkedList,我觉得,我并没有体验到链表比ArrayList快,以后再来深究。
先写一个MyLinkedList类
- package _20191210;
- import java.util.NoSuchElementException;
- public class MyLinkedList<E> {
- //List myLikedList = new LinkedList();
- Node<E> first;
- Node<E> last;
- transient int size = 0;
- public MyLinkedList(){
- }
- //linkFirst 插为第一个节点
- private void linkFirst(E e) {
- final Node<E> f = first;
- final Node<E> newNode = new Node<E>(null,e,f);
- first = newNode;
- if(f == null)
- last = newNode;
- else
- f.prev = newNode;
- size++;
- // modSize++;
- }
- //linkLast 插为最后一个节点
- private void linkLast(E e) {
- final Node<E> l = last;
- final Node<E> newNode = new Node<E>(last,e,null);
- last = newNode;//将它作为最后一个节点last
- if(l == null)//当插入的是列表中的第一个节点时,将该节点设为last与first
- first = newNode;
- else
- l.next = newNode;
- size++;
- // modCount++;
- }
- //addFirst 添加到列表的第一个
- public void addFirst(E e) {
- linkFirst(e);
- }
- //addLast
- public void addLast(E e) {
- linkLast(e);
- }
- //add
- public void add(E e) {
- linkLast(e);
- }
- /**
- * returns the first element in this List
- */
- public E getFirst() {
- final Node<E> f = first;
- if(f == null) {
- throw new NoSuchElementException();
- }
- return f.item;
- }
- //getLast返回最后一个元素
- public E getLast() {
- final Node<E> l = last;
- if(last == null) {
- throw new NoSuchElementException();
- }
- return l.item;
- }
- /**
- * removes and returns the first element from the link list.
- */
- public E removeFirst(){
- final Node<E> f = first;
- final Node<E> next = first.next;
- if(f == null) {
- throw new NoSuchElementException();
- }
- first = next;
- first.prev = null;
- size--;
- return f.item;
- }
- /**
- * removes and returns the last element from link list
- */
- public E removeLast() {
- final Node<E> l = last;
- if(l == null) {
- throw new NoSuchElementException();
- }
- if(last.prev == null) {
- E e = last.item;
- last = null;
- first = null;
- size--;
- return e;
- }
- final Node<E> prev = last.prev;
- last = prev;
- size--;
- return l.item;
- }
- /**
- * returns the size of this list
- */
- public int size() {
- return size;
- }
- /**
- * remove the first occurrence of the specified element form this list,if it is
- * present.
- */
- public boolean remove(Object o) {
- Node<E> tmp = first;
- while(tmp!=null) {
- if(tmp.item == o) {
- Node<E> prev = tmp.prev;
- Node<E> next = tmp.next;
- prev.next = next;
- next.prev = prev;
- size--;
- return true;
- }
- tmp = tmp.next;
- }
- return false;
- }
- /**
- * returns the index of the first occurrence of the specified element in this list
- * or -1 if this list does not contain the element
- */
- public int indexOf(Object o) {
- int index = 0;
- if(null == o) {
- for(Node<E> f = first;f != null;f = f.next) {
- if(f.item==o) {
- return index;
- }
- index++;
- }
- }else {
- for(Node<E> f = first;f != null;f = f.next) {
- if(o.equals(f.item)) {
- return index;
- }
- index++;
- }
- }
- return -1;
- }
- //toString
- public String toString() {
- StringBuffer sb = new StringBuffer();
- sb.append("[");
- Node<E> tmp = null;
- tmp = first;
- do{
- if(tmp==null) break;
- sb.append(tmp.item);
- if(tmp.next!=null) sb.append(", ");
- tmp = tmp.next;
- }while(tmp!=null);
- sb.append("]");
- return sb.toString();
- }
- //内部类:节点
- private static class Node<E>{
- E item;//本体
- Node<E> next;//后继
- Node<E> prev;//前驱
- public Node(Node<E> prev,E element,Node<E> next) {
- this.item = element;
- this.next = next;
- this.prev = prev;
- }
- }
- }
再写一个MyLinkedListTest测试类,测试手写LinkedList与官方LinkedList的运行结果。
- package _20191210;
- import java.util.LinkedList;
- import java.util.List;
- public class MyLinkedListTest {
- public static void main(String[] args) {
- System.out.println("---------自己写的LinkedList-----------");
- MyLinkedList<String> mk = new MyLinkedList<>();
- mk.add("Y");
- mk.add("E");
- mk.add("S");
- System.out.println(mk);
- System.out.println(mk.size());
- System.out.println("移除E:"+mk.remove("E"));
- System.out.println(mk);
- System.out.println(mk.getFirst());
- System.out.println(mk.getLast());
- System.out.println("S的位置为:"+mk.indexOf("S"));
- System.out.println("removeFirst:"+mk.removeFirst());
- System.out.println(mk.size());
- System.out.println(mk);
- System.out.println("removeLast:"+mk.removeLast());
- System.out.println(mk);
- System.out.println("---------官方LinkedList-------------");
- LinkedList<String> linkList = new LinkedList<>();
- linkList.add("Y");
- linkList.add("E");
- linkList.add("S");
- System.out.println(linkList);
- System.out.println(linkList.size());
- System.out.println("移除E:"+linkList.remove("E"));
- System.out.println(linkList);
- System.out.println(linkList.getFirst());
- System.out.println(linkList.getLast());
- System.out.println("S的位置为:"+linkList.indexOf("S"));
- System.out.println("removeFirst:"+linkList.removeFirst());
- System.out.println(linkList.size());
- System.out.println(linkList);
- System.out.println("removeLast:"+linkList.removeLast());
- System.out.println(linkList);
- }
- }
45 容器(四)——手写LinkedList的更多相关文章
- 链表设计与Java实现,手写LinkedList这也太清楚了吧!!!
链表设计与实现 在谈链表之前,我们先谈谈我们平常编程会遇到的很常见的一个问题.如果在编程的时候,某个变量在后续编程中仍需使用,我们可以用一个局部变量来保存该值,除此之外一个更加常用的方法就是使用容器了 ...
- (一)LinkedList集合解析及手写集合
一.LinkedList集合特点 问题 结 论 LinkedList是否允许空 允许 LinkedList是否允许重复数据 允许 LinkedList是否有序 有序 LinkedList是否 ...
- 【Java】 ArrayList和LinkedList实现(简单手写)以及分析它们的区别
一.手写ArrayList public class ArrayList { private Object[] elementData; //底层数组 private int size; //数组大小 ...
- 3 手写Java HashMap核心源码
手写Java HashMap核心源码 上一章手写LinkedList核心源码,本章我们来手写Java HashMap的核心源码. 我们来先了解一下HashMap的原理.HashMap 字面意思 has ...
- 1 手写Java ArrayList核心源码
手写ArrayList核心源码 ArrayList是Java中常用的数据结构,不光有ArrayList,还有LinkedList,HashMap,LinkedHashMap,HashSet,Queue ...
- opencv 手写选择题阅卷 (四)Android端 手机应用开发
opencv 手写选择题阅卷 (四)Android 手机应用开发 在PC端把代码调通以后开始开发Android 手机应用,因为主要功能代码为C++代码,所以需要通过NDK编译,JAVA通过JNI方式调 ...
- tensorflow笔记(四)之MNIST手写识别系列一
tensorflow笔记(四)之MNIST手写识别系列一 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7436310.html ...
- HTTP网络协议与手写Web服务容器
Http协议 1.深入概念 Http:HyperText Transfer Protocol,即是超文本传输协议. 2.浅出概念(使用浏览器访问服务器端网页时需要遵循的一系列规则) Http:将各种不 ...
- 手写实现ArrayList & LinkedList
微信公众号:程序媛的非程序人生 关注可了解更多资讯.问题或建议,请公众号留言; 1.手写实现ArrayList 2.手写实现 LinkedList 3.LinkedList的数据结 ...
随机推荐
- 浅谈H5图片中object-fit的属性及含义/ 小程序image mode属性中scaleToFill,aspectFit,widthFix等类似
我们在H5中对于图片的属性包含如下: object-fit属性有哪些值呢? object-fit: fill; object-fit: contain; object-fit: cover; o ...
- 使用go-mysql-server 开发自己的mysql server
go-mysql-server是一个golang 的mysql server 协议实现包,使用此工具我们可以用来做好多方便的东西 基于mysql 协议暴露自己的本地文件为sql 查询 基于mysql ...
- 二分法python实现
聚会游戏,一个人想一个数,其他人来猜,然后告诉你猜大了还是小了,直到猜到这个数. 二分法和猜数游戏类似,只不过猜的时候一定猜最中间的那个数,折半查找所需内容,就数组来说,数组越长,梯度下降越快,二分查 ...
- SpringSecurity的简单入门
以下是大体思路 1.导入坐标 <properties> <spring.version>4.2.4.RELEASE</spring.version> </pr ...
- automapper 源中有多个属性类映射到同一个 目标中
CreateMap<TempBranchActivity, BranchActivityOutput>() .ConstructUsing((src, ctx) => ctx.Map ...
- rust 函数的使用
fn main() { println!("Hello, world!"); another_function(2,3); let y ={ let x =3; //表达式的结尾没 ...
- 关于证书如何完成身份验证(SSL证书)
一.写在前面 SSL和IPsec是现在VPN技术中最为常见的,在云计算的应用环境中,SSL更受企业青睐,至于原因的话简单的说就是SSL更为简洁,不需要像IPsec那样需要额外安装客户端,这会带来软件维 ...
- html5 css3 背景视频循环播放代码
<div style ="position: absolute; z-index: -1; top: 0px; left: 0px; bottom: 0px; right: 0px; ...
- 剑指offer:丑数
题目描述: 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解题 ...
- plsql查询数据库-中文显示问号问题
解决方法: 设置本地环境变量 :NLS_LANG=AMERICAN_AMERICA.ZHS16GBK https://blog.csdn.net/github_38358734/article/det ...