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的数据结 ...
随机推荐
- CF547E Mike and Friends 后缀自动机+线段树合并
裸题,敲完后没调就过了 ~ code: #include <bits/stdc++.h> using namespace std; #define ll long long #define ...
- hibernateHQL语句
一.hql 1. 什么是hql HQL是Hibernate Query Language的缩写 查全部 2. hql和sql区别/异同 HQL SQL 类名/属性 表名/列名 区分大小写,关键字不区分 ...
- A revolutionary architecture for building a distributed graph
转自:https://blog.apollographql.com/apollo-federation-f260cf525d21 What if you could access all of you ...
- 2-ESP8266 SDK开发基础入门篇--非RTOS版与RTOS版
https://www.cnblogs.com/yangfengwu/p/11071580.html 所有的源码 https://gitee.com/yang456/Learn8266SDKDevel ...
- 计蒜客 39268.Tasks-签到 (The 2019 ACM-ICPC China Shannxi Provincial Programming Contest A.) 2019ICPC西安邀请赛现场赛重现赛
Tasks It's too late now, but you still have too much work to do. There are nn tasks on your list. Th ...
- rust-vmm 学习
V0.1.0 feature base knowledge: Architecture of the Kernel-based Virtual Machine (KVM) 用rust-vmm打造未来的 ...
- 洛谷P1854 花店橱窗布置
题目 DP,直接递推比记忆化搜索简单. 定义状态\(dp[i][j]\)为前i行最后一个选择第i行第j个数所得到最大值. 易得状态转移方程 \(dp[i][j]=max(dp[i-1][k]+a[i] ...
- C博客作业03——函数
0.展示PTA总分 截图展示: 1.本章学习总结 1.1学习内容总结 (a)函数的定义 1)函数是一个完成特定工作的独立程序模块,包括库函数和自定义函数两种,scanf(),printf()等为库函数 ...
- c博客06-结构
1.本章学习总结(2分) 1.1 学习内容总结 结构体如何定义.成员如何赋值 结构体数组排序做法 结构体指针怎么用 共用体.枚举类型做法 文件读写,文件中数据如何读进结构体数组 1.2 本章学习体会 ...
- 农场派对(party)(信息学奥赛一本通 1497)
[题目描述] N(1≤N≤1000)头牛要去参加一场在编号为 x(1≤x≤N) 的牛的农场举行的派对.有 M(1≤M≤100000) 条有向道路,每条路长 Ti(1≤Ti≤100):每头牛都必须参加完 ...