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)一 红黑树. ...
随机推荐
- HDU 5730 - Shell Necklace
题意: 给出连续的1-n个珠子的涂色方法 a[i](1<=i<=n), 问长度为n的珠链共有多少种涂色方案 分析: 可以得到DP方程: DP[n] = ∑(i=1,n) (DP[n-i]* ...
- B - A + B Again
Description There must be many A + B problems in our HDOJ , now a new one is coming. Give yo ...
- google visit
http://emuch.net/bbs/viewthread.php?tid=7630684&fpage=3&target=blank 内Facebook,twitter,dropb ...
- weblogic配置domain和删除domain
weblogic创建域的过程比较简单,但是在创建域之前一定要注意不能存在重名的domain. Domain简单定义为:是一个逻辑管理单元,Domain下面包含着weblogic应用服务器中的所有东西, ...
- C# Chart 折线图 多条数据展示
private void btn_Click(object sender, EventArgs e) { DBHelper db = new DBHelper(); DataSet ds = db.G ...
- QTextEdit中选中文本修改字体与颜色,全部文本修改字体与颜色(设置调色板的前景色、背景色、文字颜色以及基色)
----我的生活,我的点点滴滴!! 当然以下内容都可以通过设置样式来达到目的,但是下面不使用这样的方法 先来看张图,理解此图基本就能实现上面所要达到的目的了 Widget::Widget(QWidge ...
- Windows Components Reference(Windows组件参考)
原文 http://www.msfn.org/board/topic/127287-windows-components-reference/ green means the component na ...
- Inno Setup:卸载时判断要调用的dll是否存在
原文 http://zwkufo.blog.163.com/blog/static/2588251201072581947474/ [Code]function SuiteRemovedAlert2: ...
- zabbix 模版其实就是主机
</pre><pre name="code" class="python">mysql> select hostid,host , ...
- mfc窗口,父窗口parentwindow,所有者窗口ownerwindow 区别
一. parent:创建者,owner:所有者 小玉的父母生下小玉,养到8岁,卖给贾府当丫头小玉的父母是parent,贾府是owner 二. 1.Pop-up窗口: 一个弹出窗口是必须具有WS_POP ...