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的实现的更多相关文章

  1. java学习第15天(Linklist Vector)

    根据集合的分类(上一天有说),首先接触的是ArrayList但是和Collection一样,他没有什么特殊的功能,直接跳过,然后是Vector. 一   Vector A:有特有功能 a:添加 pub ...

  2. Java自己实现双向链表LinkList

    /** * <p> * Node 双向链表实体类 * <p> * * @author <a href="mailto:yangkj@corp.21cn.com& ...

  3. ArrayList和LinkList区别

    ArrayList和LinkList区别 前者是数组的数据结构,后者是链表的数据结构 前者应用于排序和查找,后者应用于插入删除

  4. Java:List,ArrayList和LinkList的区别

    1.大学数据结构中ArrayList是实现了基于动态数组的数据结构,LinkList基于链表的数据结构 2.对于随机访问get和set,ArrayList优于LinkList,因为LinkedList ...

  5. [置顶] Array ArrayList LinkList的区别剖析

    这是一个面试中我们经常被问到的问题 Array.ArrayList.LinkList之间的区别:Array.ArrayList.LinkList均属于泛型的范畴,都用来存放元素,主要区别是Array是 ...

  6. ArrayList 、Vector、 LinkList

    public class TestList {     public static void init(List list)     {         if(list!=null)          ...

  7. LinkList Operation

    链表典型数据结构: #define ElemType int typedef struct LinkNode{ ElemType value; struct LinkNode* next; }; 相比 ...

  8. 链表中LinkList L与LinkList *L 借鉴

    链表中LinkList L与LinkList *L的区别以及(*L).elem,L.elem L->next,(*L)->next的区别typedef struct Node{int el ...

  9. Data_Struct(LinkList)

    最近在学数据结构,学到链表这节作业有链表,毕竟菜鸟代码基本照看书上算法写的,再加上自己的小修改,这里先记录下来,万一哪天想看了,来看看. 里面有用到二级指针,还是不太理解,还有就是注释不多,后续有了更 ...

  10. Java集合(2)一 ArrayList 与 LinkList

    目录 Java集合(1)一 集合框架 Java集合(2)一 ArrayList 与 LinkList Java集合(3)一 红黑树.TreeMap与TreeSet(上) Java集合(4)一 红黑树. ...

随机推荐

  1. Qt WebEngine 网页交互

    环境:Qt5.7.0,VS2013 一.简单介绍 从 Qt5.4 开始已经去掉 Qt WebKit 模块了,使用的是 chrome 内核封装的 QtWebEngine,浏览器相关的类有以下几个: QW ...

  2. 解决rsync 同步auth failed on module问题

    今天在同步备份文件时遇到一个情况,以前正常的备份,在昨天突然同步备份文件失败了.于是开始检查原因..... 报错日志/var/log/rsyncd.log发现错误 // :: [] auth fail ...

  3. Entity Framework 利用 Database.SqlQuery<T> 执行存储过程,并返回Output参数值

    做个记录: var pCount = this._dataProvider.GetParameter(); pCount.ParameterName = "totalCount"; ...

  4. vi所有特殊字符

    vi5个特殊字符包含 /.^.$.*.. 在vi中用/查找时,()不做为特殊字符处理 比如:查找字符串(cyg_uint8 *)b 应该这样写 /(cyg_uint8 \*)b 只有 * 需要转义 \ ...

  5. Android系统信息

    前提:获取的都是AndroidMainfest.xml下的信息 一.PackageManager 负责管理所有已安装的App 二.ActivityInfo 封装了Mainifest中的<acti ...

  6. Thinking in Java——集合(Collection)

    一.ArrayList的使用(略) 二.容器的基本概念 (一).Collection是集合类的基本接口 主要方法: public interface Collection<E>{ bool ...

  7. 03-树2. Tree Traversals Again (25)

    03-树2. Tree Traversals Again (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue ...

  8. 【原创】QT5-卸载精灵v1.0-卸载windows软件-简易版

    由于项目需求,需要实现卸载windows上的普通软件的小功能,实现起来还是比较简单的. 先发个图: 思路: 1.根据注册表的信息去打开应用程序,卸载也一样: 2.读桌面的快捷方式,根据快捷方式的指向路 ...

  9. SQL Server 查看备份集元数据的 4 种方法。

    方法 1. restore labelonly 方法 2. restore headeronly 方法 3. restore filelistonly 方法 4. restore verifyonly ...

  10. SQL别名解析(转载)

    通过使用 SQL,可以为列名称和表名称指定别名(Alias). 其实,select列的时候取别名有三种方法,这三种方法并不是所有数据库都适用. 方法一.直接在字段名称后面加上别名,中间以空格隔开. 方 ...