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

    public class SingleCircleLinkedList<E> extends AbstractList<E> {
    	private Node<E> first;
    	
    	private static class Node<E> {
    		E element;
    		Node<E> next;
    		public Node(E element, Node<E> next) {
    			this.element = element;
    			this.next = next;
    		}
    		
    		@Override
    		public String toString() {
    			StringBuilder sb = new StringBuilder();
    			sb.append(element).append("_").append(next.element);
    			return sb.toString();
    		}
    	}
    
    	@Override
    	public void clear() {
    		size = 0;
    		first = 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);
    		
    		if (index == 0) {
    			Node<E> newFirst = new Node<>(element, first);
    			// 拿到最后一个节点
    			Node<E> last = (size == 0) ? newFirst : node(size - 1);
    			last.next = newFirst;
    			first = newFirst;
    		} else {
    			Node<E> prev = node(index - 1);
    			prev.next = new Node<>(element, prev.next);
    		}
    		size++;
    	}
    
    	@Override
    	public E remove(int index) {
    		rangeCheck(index);
    		
    		Node<E> node = first;
    		if (index == 0) {
    			if (size == 1) {
    				first = null;
    			} else {
    				Node<E> last = node(size - 1);
    				first = first.next;
    				last.next = first;
    			}
    		} else {
    			Node<E> prev = node(index - 1);
    			node = prev.next;
    			prev.next = node.next;
    		}
    		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);
    		
    		Node<E> node = first;
    		for (int i = 0; i < index; i++) {
    			node = node.next;
    		}
    		
    		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();
    	}
    }
  • 相关阅读:
    微信小程序 | 小程序的转发问题
    开发辅助 | 前端开发工程师必懂的 UI 知识
    微信小程序 | canvas绘图
    服务端 | Linux 学习总结 (一)
    移动端适配 | 适配方案总结
    开发工具 | 利用 deployd 搭建个人博客
    1.10 组织好代码文件,要有“用户思维”
    1.9 组织好代码段,让人对它“一见钟情”
    《计算机是怎样跑起来的》读书笔记(1)
    实用网站收藏
  • 原文地址:https://www.cnblogs.com/xiuzhublog/p/12608558.html
Copyright © 2011-2022 走看看