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的数据结 ...
随机推荐
- WinDbg常用命令系列---源代码操作相关命令
lsf, lsf- (Load or Unload Source File) lsf和lsf-命令加载或卸载源文件. lsf Filename lsf- Filename 参数: Filename指定 ...
- js改变this指向
js中修改this的指向 方法整理 call,apply,bind 以上的三哥方法都是用来改变js中this的指向 call 使用方法:fun.call(thisArg[,arg1[, arg2[, ...
- ipcs
用于报告Linux中进程间通信设施的状态,显示的信息包括消息列表.共享内存和信号量的信息
- 25-ESP8266 SDK开发基础入门篇--控制WIFI连接路由器
https://www.cnblogs.com/yangfengwu/p/11324411.html 说个事情,现在SDK的版本已经出到3.0了,但是我还是使用2.0 如果只是为了学习研究 选择3 ...
- windbg预览版,windbg preview配置win7x64双机调试
目录 一丶简介 二丶步骤 1.下载Windbg Preview (windbg预览版本) 2.配置虚拟机端口 3.虚拟机设置调试湍口 4.windbg preview开始调试. 一丶简介 Windbg ...
- mysql 提示ssl问题
问题信息如下: rements SSL connection must be established by default if explicit option isn't set. For comp ...
- mysql下sql语句令某字段值等于原值加上一个字符串
MYSQL在一个字段值后面加字符串,如下: member 表名 card 字段名 update member SET card = '00' || card; (postgreSQL 用 || 来连贯 ...
- js注册表单中实现地区选择效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 多线程 interrupt()方法
java interrupt()方法只是设置线程的中断标记,当对处于阻塞状态的线程调用interrupt方法时(处于阻塞状态的线程是调用sleep, wait, join 的线程),会抛出Interr ...
- hadoop作业
作业要求:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3223 一.准备一个ubantu 系统 二.创建hadoop用户 创建 设密 ...