LinkList的实现

  1 public class MyLinkedList<AnyType> implements Iterable<AnyType> {
  2     @Override
  3     public Iterator<AnyType> iterator() {
  4         return new LinkedListIterator();
  5     }
  6
  7     public class LinkedListIterator implements Iterator<AnyType>{
  8
  9         private Node current = beginMarker.next;
 10         private int expectedModCount = modCount;
 11         private int okToRemove = 0;
 12
 13         @Override
 14         public boolean hasNext() {
 15             return current != endMarker;
 16         }
 17
 18         @Override
 19         public AnyType next() {
 20             if(modCount != expectedModCount)
 21                 throw new ConcurrentModificationException();
 22             if(!hasNext())
 23                 throw new NoSuchElementException();
 24
 25             AnyType element =  (AnyType)current.data;
 26             current = current.next;
 27             okToRemove++;
 28             return element;
 29         }
 30
 31         public void remove(){
 32             if(modCount != expectedModCount)
 33                 throw new  ConcurrentModificationException();
 34             if(okToRemove>0)
 35                 throw new IllegalStateException();
 36
 37             MyLinkedList.this.remove(current.prev);
 38             okToRemove--;
 39             expectedModCount++;
 40         }
 41     }
 42
 43
 44
 45     private static class Node<AnyType>{
 46         public Node(AnyType d, Node<AnyType> p , Node<AnyType> n){
 47             data = d; prev = p; next = n;
 48         }
 49         public AnyType data;
 50         public Node<AnyType> prev;
 51         public Node<AnyType> next;
 52     }
 53
 54     private int theSize;
 55     private int modCount = 0;
 56     private Node<AnyType> beginMarker;
 57     private Node<AnyType> endMarker;
 58
 59     public void clear(){
 60         beginMarker = new Node<>(null,null,null);//endMarker还没有定义,因此还不能作为参数传入
 61         endMarker = new Node<>(null,beginMarker,null);
 62         beginMarker.next = endMarker;
 63
 64         theSize = 0;
 65         modCount++;
 66     }
 67
 68     public int size(){
 69         return theSize;
 70     }
 71
 72     public boolean isEmpty(){
 73             return (size() == 0);
 74     }
 75
 76     public Node<AnyType> getNode(int idx){
 77         if(idx < 0 || idx >= theSize)
 78             throw new IndexOutOfBoundsException();
 79         Node<AnyType> thisNode;
 80         if(idx < size()/2){
 81             thisNode = beginMarker.next;
 82             for(int i = 0; i < idx; i++)
 83                 thisNode = thisNode.next;
 84         }
 85         else {
 86             thisNode = endMarker.prev;
 87             for(int i = size(); i > idx; i--)
 88                 thisNode = thisNode.prev;
 89         }
 90         return thisNode;
 91     }
 92
 93     public void add(int idx,AnyType element){
 94         addBefore(idx,element);
 95     }
 96
 97     public void addBefore(int idx, AnyType element){
 98         if(idx < 0 || idx > size()){ //可取的最大值是最后一个的下一个
 99             throw new IndexOutOfBoundsException();
100         }
101         Node p = getNode(idx);
102         Node current = new Node(element,p.prev,p);
103         p.prev.next = current;
104         p.prev = current;
105         theSize++;
106         modCount++;
107     }
108
109     public boolean add(AnyType element){
110         add(theSize,element);
111         return true;
112     }
113
114     public AnyType set(int idx, AnyType element){
115         Node p = getNode(idx);
116         AnyType oldVal = (AnyType) p.data;
117         p.data = element;
118         return oldVal;
119     }
120
121     public AnyType remove(int idx){
122         return remove(getNode(idx));
123     }
124
125     public AnyType remove(Node p){
126         p.prev.next = p.next;
127         p.next.prev = p.prev;
128         theSize--;
129         modCount++;
130         return (AnyType)p.data;
131     }
132 }

在链表和其迭代器中都定义modCount来标记当前操作数,是为了防止在两个类的对象中任意一个操作数据时,其他线程将链表改变,
如果modCount不匹配,则说明问题暴漏,即"快速失败".
okToRemove是为了防止删除头结点而设计.

时间: 2024-10-19 05:47:47

LinkList的实现的相关文章

LinkList

LinkList:java中jdk1.6之后java.util.LinkList 类中对分装链表的理解: 参考:http://www.cnblogs.com/lintong/p/4374292.html 第一部分:熟悉LinkList中哪些方法和其构造;第二部分熟悉使用JDK中LinkList的API接口 第1部分:LinkList 的介绍: linklist:是一个双向链表,当做堆栈,队列或者双端队列进行操作:当做stack时候只能用push,pop,peek方法:当做队列时候用 add,re

链表中LinkList L与LinkList *L 借鉴

链表中LinkList L与LinkList *L的区别以及(*L).elem,L.elem L->next,(*L)->next的区别typedef struct Node{int elem;struct node * next;}node,*LinkList; 对于LinkList L: L是指向定义的node结构体的指针,可以用->运算符来访问结构体成员,即L->elem,而(*L)就是个Node型的结构体了,可以用点运算符访问该结构体成员,即(*L).elem; 对于Lin

Data_Struct(LinkList)

最近在学数据结构,学到链表这节作业有链表,毕竟菜鸟代码基本照看书上算法写的,再加上自己的小修改,这里先记录下来,万一哪天想看了,来看看. 里面有用到二级指针,还是不太理解,还有就是注释不多,后续有了更好的理解,再来添加 1 #define TRUE 1 2 #define FALSE 0 3 #define OK 1 4 #define ERROR 0 5 #define OVERFLOW -2 6 #define INFEASIBLE -1 7 #define Status int 8 #de

转——链表中LinkList L与LinkList *L的区别

typedef struct Node{ int elem; struct node * next; }node,*LinkList; 对于LinkList L: L是指向定义的node结构体的指针,可以用->运算符来访问结构体成员,即L->elem,而(*L)就是个Node型的结构体了,可以用点运算符访问该结构体成员,即(*L).elem; 对于LinkList *L:L是指向定义的Node结构体指针的指针,所以(*L)是指向Node结构体的指针,可以用->运算符来访问结构体成员,即(

002 -- Circle LinkList 2 -- connect 2 circle link lists

The operation fullfilled codes: // A, B is the rear for 2 LinkList with nodes LinkList Connect(LinkList A,LinkList B) { p = A->next; // use p to store A list head A->next = B->next->next; // A change to point to b1 as the next. free(B->next

1.使用C++封装一个链表类LinkList

 使用C++封装一个链表类LinkList.写出相应一个测试用例 链表需要提供 添加 修改删除 除重 合并 排序创建 销毁等接口. 不能调用库函数或者使用STL等类库 题目延伸***********逆置链表********** LinkNode.h #ifndef LINKNODE_H #define LINKNODE_H #include <iostream> class LinkNode { public: int m_idata; LinkNode* m_pnext; }; #end

Java集合篇二:LinkList

package com.test.collection; /** * 自定义实现LinkList * * 1.双向链表 * 实现原理:底层封装Node节点对象(每个节点存放有3部分内容:1.上个节点的位置,2.当前节点内容,3.下一个节点的位置) * * 2.查询 * LinkList 相较 ArrayList 查询效率低: * 由于LinkList底层存放元素的不是数组,不能直接通过索引进行获取,需要从头或者从尾逐一遍历索引节点对象. * ArrayList直接通过索引获取即可. * * 3.

java学习第15天(Linklist Vector)

根据集合的分类(上一天有说),首先接触的是ArrayList但是和Collection一样,他没有什么特殊的功能,直接跳过,然后是Vector. 一   Vector A:有特有功能 a:添加 public void addElement(E obj) -- add() b:获取 public E elementAt(int index) -- get() 主要用的是第二个获取.举个例子. 简化书写下: v.addElement("hello"); v.addElement("

002 -- Circle LinkList 3 -- Puzzels_Magic Poker and Latin

000--Magic Poker Put the poker with specific sequence, so that they can show as below: count 1, open the first card as A, count 2, the first one place to bottom and open the second one as 2; for 3, the first 2 cards put to the bottom, and open the th

string和stringbuffer的区别 集合的作用 ArrayList vector linklist hashmap hashtable collection和collections

string给定的长度 不可变,当多个字符串联合的时候先转化为stringbuffer然后联合,速度慢,stringbuffer可以改变字符串的长度,当多个字符串连接的时候采用stringbuffer效率比较高. 集合的作用 对数据进行传送,对数据进行增删改查,还可以用来存放不同的对象. import java.util.Vector;import java.util.List;import java.util.Iterator;import java.util.Enumeration; /**