LinkList的实现
public class MyLinkedList<AnyType> implements Iterable<AnyType> {
@Override
public Iterator<AnyType> iterator() {
return new LinkedListIterator();
} public class LinkedListIterator implements Iterator<AnyType>{ private Node current = beginMarker.next;
private int expectedModCount = modCount;
private int okToRemove = 0; @Override
public boolean hasNext() {
return current != endMarker;
} @Override
public AnyType next() {
if(modCount != expectedModCount)
throw new ConcurrentModificationException();
if(!hasNext())
throw new NoSuchElementException(); AnyType element = (AnyType)current.data;
current = current.next;
okToRemove++;
return element;
} public void remove(){
if(modCount != expectedModCount)
throw new ConcurrentModificationException();
if(okToRemove>0)
throw new IllegalStateException(); MyLinkedList.this.remove(current.prev);
okToRemove--;
expectedModCount++;
}
} private static class Node<AnyType>{
public Node(AnyType d, Node<AnyType> p , Node<AnyType> n){
data = d; prev = p; next = n;
}
public AnyType data;
public Node<AnyType> prev;
public Node<AnyType> next;
} private int theSize;
private int modCount = 0;
private Node<AnyType> beginMarker;
private Node<AnyType> endMarker; public void clear(){
beginMarker = new Node<>(null,null,null);//endMarker还没有定义,因此还不能作为参数传入
endMarker = new Node<>(null,beginMarker,null);
beginMarker.next = endMarker; theSize = 0;
modCount++;
} public int size(){
return theSize;
} public boolean isEmpty(){
return (size() == 0);
} public Node<AnyType> getNode(int idx){
if(idx < 0 || idx >= theSize)
throw new IndexOutOfBoundsException();
Node<AnyType> thisNode;
if(idx < size()/2){
thisNode = beginMarker.next;
for(int i = 0; i < idx; i++)
thisNode = thisNode.next;
}
else {
thisNode = endMarker.prev;
for(int i = size(); i > idx; i--)
thisNode = thisNode.prev;
}
return thisNode;
} public void add(int idx,AnyType element){
addBefore(idx,element);
} public void addBefore(int idx, AnyType element){
if(idx < 0 || idx > size()){ //可取的最大值是最后一个的下一个
throw new IndexOutOfBoundsException();
}
Node p = getNode(idx);
Node current = new Node(element,p.prev,p);
p.prev.next = current;
p.prev = current;
theSize++;
modCount++;
} public boolean add(AnyType element){
add(theSize,element);
return true;
} public AnyType set(int idx, AnyType element){
Node p = getNode(idx);
AnyType oldVal = (AnyType) p.data;
p.data = element;
return oldVal;
} public AnyType remove(int idx){
return remove(getNode(idx));
} public AnyType remove(Node p){
p.prev.next = p.next;
p.next.prev = p.prev;
theSize--;
modCount++;
return (AnyType)p.data;
}
}
在链表和其迭代器中都定义modCount来标记当前操作数,是为了防止在两个类的对象中任意一个操作数据时,其他线程将链表改变,
如果modCount不匹配,则说明问题暴漏,即"快速失败".
okToRemove是为了防止删除头结点而设计.
LinkList的实现的更多相关文章
- java学习第15天(Linklist Vector)
根据集合的分类(上一天有说),首先接触的是ArrayList但是和Collection一样,他没有什么特殊的功能,直接跳过,然后是Vector. 一 Vector A:有特有功能 a:添加 pub ...
- Java自己实现双向链表LinkList
/** * <p> * Node 双向链表实体类 * <p> * * @author <a href="mailto:yangkj@corp.21cn.com& ...
- ArrayList和LinkList区别
ArrayList和LinkList区别 前者是数组的数据结构,后者是链表的数据结构 前者应用于排序和查找,后者应用于插入删除
- Java:List,ArrayList和LinkList的区别
1.大学数据结构中ArrayList是实现了基于动态数组的数据结构,LinkList基于链表的数据结构 2.对于随机访问get和set,ArrayList优于LinkList,因为LinkedList ...
- [置顶] Array ArrayList LinkList的区别剖析
这是一个面试中我们经常被问到的问题 Array.ArrayList.LinkList之间的区别:Array.ArrayList.LinkList均属于泛型的范畴,都用来存放元素,主要区别是Array是 ...
- ArrayList 、Vector、 LinkList
public class TestList { public static void init(List list) { if(list!=null) ...
- LinkList Operation
链表典型数据结构: #define ElemType int typedef struct LinkNode{ ElemType value; struct LinkNode* next; }; 相比 ...
- 链表中LinkList L与LinkList *L 借鉴
链表中LinkList L与LinkList *L的区别以及(*L).elem,L.elem L->next,(*L)->next的区别typedef struct Node{int el ...
- Data_Struct(LinkList)
最近在学数据结构,学到链表这节作业有链表,毕竟菜鸟代码基本照看书上算法写的,再加上自己的小修改,这里先记录下来,万一哪天想看了,来看看. 里面有用到二级指针,还是不太理解,还有就是注释不多,后续有了更 ...
- Java集合(2)一 ArrayList 与 LinkList
目录 Java集合(1)一 集合框架 Java集合(2)一 ArrayList 与 LinkList Java集合(3)一 红黑树.TreeMap与TreeSet(上) Java集合(4)一 红黑树. ...
随机推荐
- CentOS Apache服务器安装与配置
原文地址:http://www.linuxidc.com/Linux/2014-01/95256.htm 一.安装Apache程序,一般有三种安装方式: Apache在centos下httpd1.直接 ...
- [转]Linux netstat命令详解
简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Member ...
- Ecsotre 参考
2.dbschema dbschema 字段属性 ‘type’ => ‘int unsigned’, //字段类型 ‘extra’ => ‘auto_increment’,//定义自增 ‘ ...
- 经典面试题(二)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
1.正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项, 例如,当a=3,b=5,N=6时,序列为3,5,6,9,10,12 (1).设计一个函数void ...
- 自学nodejs系列
好久没有搞nodejs了.nodejs也是更新的很快!!当初翻译的文档
- XML的命名空间
XML命名空间提供避免元素命名冲突的方法. 命名冲突:在XML中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突. 这个XML文档携带着某个表格中的信息: <ta ...
- 一个简单的倒计时js插件
接收的参数end是必须传的,格式是/分隔的日期字符串,start是可选的,不传就是从现在开始倒计时,callback也是可选的,到倒计时接收时执行自定义的函数. countdown({ 'end':' ...
- HDOJ-1003 Max Sum(最大连续子段 动态规划)
http://acm.hdu.edu.cn/showproblem.php?pid=1003 给出一个包含n个数字的序列{a1,a2,..,ai,..,an},-1000<=ai<=100 ...
- linux守护进程解读
Linux系统守护进程详解 不要关闭下面这几个服务: acpid, haldaemon, messagebus, klogd, network, syslogd 1. NetworkManag ...
- 2.2.2 胸腰差和胸臀差的应用_米人NOONE_新浪博客
2.2.2 胸腰差和胸臀差的应用_米人NOONE_新浪博客 腰差和胸臀差的应用(2009-06-16 19:24:57)转载▼标签:校园 前面已经对这两个概念作了简单的讲解.这两个概 ...