数据结构与算法分析:LinkedList

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;
		}
	}
	
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值