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的数据结 ...
随机推荐
- Java web开发——文件的上传和下载
一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输. ...
- Codeforces & Atcoder神仙题做题记录
鉴于Codeforces和atcoder上有很多神题,即使发呆了一整节数学课也是肝不出来,所以就记录一下. AGC033B LRUD Game 只要横坐标或者纵坐标超出范围就可以,所以我们只用看其中一 ...
- GoCN每日新闻(2019-10-07)
GoCN每日新闻(2019-10-07) 国庆专辑:GopherChina 祝大家国庆节快乐(假期最后一天) GoCN每日新闻(2019-10-07) 1. Go 不好的点:JSON 解析的探 ...
- 基于Linux(中标麒麟)上QT的环境搭建——解决cannot find lGL的问题
接上一篇,QT在中标麒麟环境安装完成后遇到运行报错的问题 一.问题描述: 在中标麒麟上配置好QT的环境后,新建一个工程,不做其他的任何操作,直接运行都会报cannot find lGL的错误.如图所示 ...
- shell 杀死80端口的所有进程
netstat -lnp|grep |grep -v grep |awk
- mysql 分组和排序
mysql> select * from table1; +----------+------------+-----+---------------------+ | name_new | t ...
- 微信小程序 按钮固定在页面底部遮住页面显示内容问题
我们分为以下部分来解决这个问题: 第一部分:问题的表现是怎么样的? 第二部分:问题的是如何实现的? 第三部分:如何解决问题? 第一部分:问题的表现是怎么样的? 我设置了页面有0-99共100个数,但是 ...
- 怎么在浏览器设置cookie
document.cookie="jwt=xxxxxx" 遇到了一个bug 开了代理没有办法做图片上传
- mysql 遍历所有表并条件查询
use eepm_push; DROP PROCEDURE IF EXISTS FountTable; delimiter $$ create procedure FountTable() begin ...
- D3.js的v5版本入门教程(第十一章)——交互式操作
D3.js的v5版本入门教程(第十一章) 与图形进行交互操作是很重要的!所谓的交互操作也就是为图形元素添加监听事件,比如说当你鼠标放在某个图形元素上面的时候,就会显示相应的文字,而当鼠标移开后,文字就 ...