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的数据结 ...
随机推荐
- 样式声明对象:document.styleSheets[0].rules[4].style;
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 29-ESP8266 SDK开发基础入门篇--编写TCP 客户端程序(Lwip RAW模式,非RTOS版,精简入门)
https://www.cnblogs.com/yangfengwu/p/11456667.html 由于上一节的源码长时间以后会自动断开,所以再做这一版非RTOS版的,咱直接用lua源码里面别人写的 ...
- Django自带后台admin的使用配置
Django自带后台使用配置参考官网地址:https://docs.djangoproject.com/en/1.11/ref/contrib/admin/ ,本文章值是介绍简单配置,如果需要详细内容 ...
- TP5验证码上传阿里云万网虚拟主机后,验证码不显示的解决办法
TP5不显示验证码 清除缓冲区就应该可以了,今天我刚好也遇到了,解决的办法是在vendor/topthink/think-captcha/CaptchaController.php中加上这个ob_cl ...
- ICEM-实验环
原视频下载地址:https://pan.baidu.com/s/1eSbxiO6 密码: 7114
- Win10系统下安装ubuntu16.04双系统-常见问题解答
Win10系统下安装ubuntu16.04双系统-常见问题解答 1. 安装ubuntu16.04.2系统 磁盘分区形式有两种:GPT和MBR,关系到设置引导项.在win10下压缩出500GB空间给ub ...
- Prometheus监控神技--自动发现配置
一.自动发现类型 在上一篇文中留了一个坑: 监控某个statefulset服务的时候,我在service文件中定义了个EP,然后把pod的ip写死在配置文件中,这样,当pod重启后,IP地址变化,就监 ...
- hotspot编译
"AA=="1",==", /usr/bin/make -s VERBOSE="-s" LOG_LEVEL="warn" ...
- Pygame 贪吃蛇
目录 代码 遇到的问题 参考 代码 #-*-encoding=utf-8-*- # Wormy(a Nibbles clone) # By Al Sweigart al@inventwithpytho ...
- ubuntu之路——day15.2 只用python的numpy在底层检验正则化对模型的影响
首先感谢这位博主整理的Andrew Ng的deeplearning.ai的相关作业:https://blog.csdn.net/u013733326/article/details/79827273 ...