zoukankan      html  css  js  c++  java
  • 双向循环链表

    public class CircleLinkedList<E> extends AbstractList<E> {
    	private Node<E> first;
    	private Node<E> last;
    	private Node<E> current; 
    	
    	private static class Node<E> {
    		E element;
    		Node<E> prev;
    		Node<E> next;
    		public Node(Node<E> prev, E element, Node<E> next) {
    			this.prev = prev;
    			this.element = element;
    			this.next = next;
    		}
    		
    		@Override
    		public String toString() {
    			StringBuilder sb = new StringBuilder();
    			
    			if (prev != null) {
    				sb.append(prev.element);
    			} else {
    				sb.append("null");
    			}
    			
    			sb.append("_").append(element).append("_");
    
    			if (next != null) {
    				sb.append(next.element);
    			} else {
    				sb.append("null");
    			}
    			
    			return sb.toString();
    		}
    	}
    	
    	public void reset() {
    		current = first;
    	}
    	
    	public E next() {
    		if (current == null) return null;
    		
    		current = current.next;
    		return current.element;
    	}
    	
    	public E remove() {
    		if (current == null) return null;
    		
    		Node<E> next = current.next; 
    		E element = remove(current);
    		if (size == 0) {
    			current = null;
    		} else {
    			current = next;
    		}
    		
    		return element;
    	}
    
    	@Override
    	public void clear() {
    		size = 0;
    		first = null;
    		last = null;
    	}
    
    	@Override
    	public E get(int index) {
    		return node(index).element;
    	}
    
    	@Override
    	public E set(int index, E element) {
    		Node<E> node = node(index);
    		E old = node.element;
    		node.element = element;
    		return old;
    	}
    
    	@Override
    	public void add(int index, E element) {
    		rangeCheckForAdd(index);
    
    		// size == 0
    		// index == 0
    		if (index == size) { // 往最后面添加元素
    			Node<E> oldLast = last;
    			last = new Node<>(oldLast, element, first);
    			if (oldLast == null) { // 这是链表添加的第一个元素
    				first = last;
    				first.next = first;
    				first.prev = first;
    			} else {
    				oldLast.next = last;
    				first.prev = last;
    			}
    		} else {
    			Node<E> next = node(index); 
    			Node<E> prev = next.prev; 
    			Node<E> node = new Node<>(prev, element, next);
    			next.prev = node;
    			prev.next = node;
    			
    			if (next == first) { // index == 0
    				first = node;
    			}
    		}
    		
    		size++;
    	}
    
    	@Override
    	public E remove(int index) {
    		rangeCheck(index);
    		return remove(node(index));
    	}
    	
    	private E remove(Node<E> node) {
    		if (size == 1) {
    			first = null;
    			last = null;
    		} else {
    			Node<E> prev = node.prev;
    			Node<E> next = node.next;
    			prev.next = next;
    			next.prev = prev;
    			
    			if (node == first) { // index == 0
    				first = next;
    			}
    			
    			if (node == last) { // index == size - 1
    				last = prev;
    			}
    		}
    		
    		size--;
    		return node.element;
    	}
    
    	@Override
    	public int indexOf(E element) {
    		if (element == null) {
    			Node<E> node = first;
    			for (int i = 0; i < size; i++) {
    				if (node.element == null) return i;
    				
    				node = node.next;
    			}
    		} else {
    			Node<E> node = first;
    			for (int i = 0; i < size; i++) {
    				if (element.equals(node.element)) return i;
    				
    				node = node.next;
    			}
    		}
    		return ELEMENT_NOT_FOUND;
    	}
    	
    	/**
    	 * 获取index位置对应的节点对象
    	 * @param index
    	 * @return
    	 */
    	private Node<E> node(int index) {
    		rangeCheck(index);
    		
    		if (index < (size >> 1)) {
    			Node<E> node = first;
    			for (int i = 0; i < index; i++) {
    				node = node.next;
    			}
    			return node;
    		} else {
    			Node<E> node = last;
    			for (int i = size - 1; i > index; i--) {
    				node = node.prev;
    			}
    			return node;
    		}
    	}
    	
    	@Override
    	public String toString() {
    		StringBuilder string = new StringBuilder();
    		string.append("size=").append(size).append(", [");
    		Node<E> node = first;
    		for (int i = 0; i < size; i++) {
    			if (i != 0) {
    				string.append(", ");
    			}
    			
    			string.append(node);
    			
    			node = node.next;
    		}
    		string.append("]");
    		return string.toString();
    	}
    }
    
  • 相关阅读:
    myeclipse中代码不显示SVN版本号
    java HttpURLConnection 登录网站 完整代码
    新浪微博自动(模拟)登陆详解及实现
    java模拟Cookies登陆
    paper 53 :深度学习(转载)
    paper 52 :windows7环境下theano安装
    paper 51:图像复原
    paper 50 :人脸识别简史与近期进展
    paper 49:论文退稿?审稿人帮你总结了22个能避免的常见问题
    paper 48: Latex中如何制作参考文献
  • 原文地址:https://www.cnblogs.com/xiuzhublog/p/12608557.html
Copyright © 2011-2022 走看看