Java集合篇二:LinkList
package com.test.collection; /**
* 自定义实现LinkList
*
* 1.双向链表
* 实现原理:底层封装Node节点对象(每个节点存放有3部分内容:1.上个节点的位置,2.当前节点内容,3.下一个节点的位置)
*
* 2.查询
* LinkList 相较 ArrayList 查询效率低:
* 由于LinkList底层存放元素的不是数组,不能直接通过索引进行获取,需要从头或者从尾逐一遍历索引节点对象。
* ArrayList直接通过索引获取即可。
*
* 3.删除、插入
* linkList 相较ArrayList 插入、删除的效率高
* LinkList 直接打断前后的链接,链接到新对象即可;
* 而ArrayList插入之后需要对后面的元素 进行整体移位
* @author chenx
*
*/
public class MyLinkList {
private Node first;
private Node last;
public int size; public void add(Object obj){
Node node=new Node();
if(first == null){
node.prev=null;
node.element=obj;
node.next=null;
first=node;
last=node;
}else{
//默认直接追加到最后
node.prev=last;
node.element=obj;
node.next=null;
last.next =node;
last =node;
}
size ++;
} /**
* 由于不是数组,不能直接通过索引进行获取,需要从头或者从尾逐一遍历索引节点对象
* 因此,相较ArrayList查询要慢
* @param index
* @return
*/
public Object get(int index){
rangeCheck(index);//下标越界检查
Node temp=node(index);//获取当前节点
return temp.element;
} /**
* 链表移除,直接打断前后的链接,链接到新对象即可;
* 而ArrayList删除之后需要对后面的元素 进行整体移位,
* 因此:linkList 相较ArrayList 删除的速度快
* @param index
* @param obj
*/
public void remove(int index){
rangeCheck(index);//下标越界检查
Node temp=node(index);//获取当前节点
Node up=temp.prev;
Node down=temp.next; if(up==null){
first = down;
}else{
up.next=down;
} if(down==null){
last = up;
}else{
down.prev=up;
} size--;
}
//获取节点
Node node(int index){//通过节点遍历实现类似索引的效果
Node temp=first;
if(first !=null){
if(index <(size >>1)){
temp=first;
for(int i=0;i<index;i++){
temp = temp.next;
}
}else{
temp=last;
for(int i=size;i>index;i--){
temp = temp.prev;
}
}
}
return temp;
}
/**
* 链表插入,直接打断前后的链接,链接到新对象即可;
* 而ArrayList插入之后需要对后面的元素 进行整体移位,
* 因此:linkList 相较ArrayList 插入的速度快
* @param index
* @param obj
*/
public void add(int index,Object obj){
Node temp=node(index);//获取当前节点
Node newNode=new Node();
newNode.element=obj;
if(temp!=null){
Node up=temp.prev;
up.next=newNode;
newNode.prev=up;
newNode.next=temp;
temp.prev=newNode;
size++;
}
} public int size(){
return size;
} //下标越界检查
private void rangeCheck(int index){
if(index<0 || index>size){
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
MyLinkList mylinkList=new MyLinkList();
mylinkList.add("aaa");
mylinkList.add("bbb");
mylinkList.add("ccc"); mylinkList.remove(1);
for(int i=0;i<mylinkList.size;i++){
System.out.println(mylinkList.get(i));
}
}
}
Node.java
package com.test.collection;
public class Node {
Node prev;
Object element;
Node next;
public Node() {
}
public Node(Node prev, Object element, Node next) {
super();
this.prev = prev;
this.element = element;
this.next = next;
}
}
Java集合篇二:LinkList的更多相关文章
- 【转】java提高篇(二)-----理解java的三大特性之继承
[转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...
- 【由浅入深理解java集合】(二)——集合 Set
上一篇文章介绍了Set集合的通用知识.Set集合中包含了三个比较重要的实现类:HashSet.TreeSet和EnumSet.本篇文章将重点介绍这三个类. 一.HashSet类 HashSet简介 H ...
- Java集合系列(二):ArrayList、LinkedList、Vector的使用方法及区别
本篇博客主要讲解List接口的三个实现类ArrayList.LinkedList.Vector的使用方法以及三者之间的区别. 1. ArrayList使用 ArrayList是List接口最常用的实现 ...
- (Set, Map, Collections工具类)JAVA集合框架二
Java集合框架部分细节总结二 Set 实现类:HashSet,TreeSet HashSet 基于HashCode计算元素存放位置,当计算得出哈希码相同时,会调用equals判断是否相同,相同则拒绝 ...
- java提高篇(二)-----理解java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- (转)java提高篇(二)-----理解java的三大特性之继承
在<Think in java>中有这样一句话:复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对加以改变是不够的,它还必须能够做更多的事情.在这句 ...
- java 集合框架(二)Iterable接口
Iterable接口是java 集合框架的顶级接口,实现此接口使集合对象可以通过迭代器遍历自身元素,我们可以看下它的成员方法 修饰符和返回值 方法名 描述 Iterator<T> iter ...
- 不可错过的java面试博客之java集合篇
1. List List 是有序的 Collection.Java List 一共三个实现类: 分别是 ArrayList.Vector 和 LinkedList ArrayList ArrayLis ...
- java基础篇二
引言 滴,第二天卡. 五.关键字 -static -初始化顺序 -静态变量和静态语句块优先于实例变量和普通语句块,静态变量和静态语句块的初始化顺序取决于它们在代 ...
随机推荐
- pip_install的安装
1.下载get-pip.py https://pip.pypa.io/en/latest/installing/#id9 2.运行 python get-pip.py 3.python -m pip ...
- Sample-Code:Bing Search API
Demo link: http://code.msdn.microsoft.com/windowsazure/How-to-use-bing-search-API-4c8b287e Aspx Code ...
- 16、OpenCV Python 腐蚀和彭胀
__author__ = "WSX" import cv2 as cv import numpy as np def erode_demo(image): print(image. ...
- 最小生成树问题:Kruskal算法 AND Prim算法
Kruskal算法: void Kruskal ( ) { MST = { } ; //边的集合,最初为空集 while( Edge ...
- AVFoundation 文本播报
#import <Foundation/Foundation.h> #import <AVFoundation/AVFoundation.h> @interface Speak ...
- requests库安装
1.运行cmd输入pip install requests C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Scripts ...
- MVC4设置伪静态---路由伪静态
有些客户要求设置静态的,为了完成需求,而且更简单的做法就是设置伪静态,例如:http://localhost:80/Home/Index.html ,也可以访问http://localhost:80/ ...
- Covering(矩阵快速幂)
Bob's school has a big playground, boys and girls always play games here after school. To protect b ...
- HDU - 1223 DP 分类
据说这个是经典问题 \(dp[i][j]=dp[i-1][j-1]*j+dp[i-1][j]*j\) \(dp[i][j]\)表示前i个数分为j个集合,[i-1][j-1]为插入小于号[i-1][j] ...
- PHP返回变量或数组的字符串表示:var_export()
使用var_export()函数可以在服务端程序没有在打印的情况下,配合file_put_contents方便的调试程序,查看变量和数组的内容. 在开发过程中,我们常用var_dump()来打印数组内 ...