class MyLinkedList<AnyType> implements Iterable<AnyType>
{
public int theSize;
public int modCount = 0;
public Node<AnyType> beginMarker;
public Node<AnyType> endMarker;
//节点
private static class Node<AnyType>
{
public AnyType data;
public Node<AnyType> prev;
public Node<AnyType> next;
public Node(AnyType d, Node<AnyType> p, Node<AnyType> n)
{
data = d;
prev = p;
next = n;
}
}
//初始化链表
public MyLinkedList()
{
doClear();
}
//clear方法
public void clear()
{
doClear();
}
private void doClear()
{
beginMarker = new Node<AnyType>(null,null,null);
endMarker = new Node<AnyType>(null,beginMarker,null);
beginMarker.next = endMarker;
theSize = 0;
modCount++;
}
//size方法
public int size()
{
return theSize;
}
//isEmpty方法
public boolean isEmpty()
{
return size() == 0;
}
//add方法
public boolean add(AnyType x)
{
add(size(),x);
return true;
}
public void add(int index, AnyType x)
{
addBefore(getNode(index, 0 , size()),x);
}
//addBefore方法,在一个指定节点前添加一个节点
private void addBefore(Node<AnyType> p, AnyType x)
{
Node<AnyType> newNode = new Node<AnyType>(x,p.prev,p);
newNode.prev.next = newNode;
p.prev = newNode;
theSize++;
modCount++;
}
//getNode方法:获得节点
private Node<AnyType> getNode(int index)
{
return getNode(index, 0, size()-1);
}
private Node<AnyType> getNode(int index, int lower,int upper)
{
Node<AnyType> p;
if(index<lower || index>upper)
throw new IndexOutOfBoundsException("getNode index: "+index+" ; size: "+size());
if(index < size()/2)
{
p = beginMarker.next;
for(int i = 0; i < index; i++)
p = p.next;
}
else
{
p = endMarker;
for(int i = size();i > index; i--)
p = p.prev;
}
return p;
}
//get方法
public AnyType get(int index)
{
return getNode(index).data;
}
//set方法
public AnyType set(int index, AnyType newVal)
{
Node<AnyType> p = getNode(index);
AnyType old = p.data;
p.data = newVal;
return old;
}
//remove方法
public AnyType remove(int index)
{
return remove(getNode(index));
}
private AnyType remove(Node<AnyType> p)
{
p.next.prev = p.prev;
p.prev.next = p.next;
theSize--;
modCount++;
return p.data;
}
//toString方法
public String toString()
{
StringBuffer sb = new StringBuffer( "[ " );
for( AnyType x : this )
sb.append( x + " " );
sb.append( "]" );
return new String(sb);
}
//迭代器
public Iterator<AnyType> iterator()
{
return new LinkedListIterator();
}
private class LinkedListIterator implements Iterator<AnyType>
{
private Node<AnyType> current = beginMarker.next;//未加.next,开始只是一个标记
private int exceptedModCount = modCount;
private boolean okToMove = false;
public boolean hasNext()
{
return current != endMarker;
}
public AnyType next()
{
if(modCount != exceptedModCount)
throw new ConcurrentModificationException();
if(!hasNext())
throw new NoSuchElementException();
AnyType nextItem = current.data;
current = current.next;//赋值语句写反
okToMove = true;
return nextItem;
}
public void remove()
{
if(modCount != exceptedModCount)
throw new ConcurrentModificationException();
if(!okToMove)
throw new IllegalStateException();
MyLinkedList.this.remove(current.prev);
exceptedModCount++;
okToMove = false;
}
}
}
数据结构与算法分析:LinkedList
最新推荐文章于 2024-07-14 16:24:46 发布