package com.coding.basic.impl; import java.util.NoSuchElementException; import com.coding.basic.Iterator; import com.coding.basic.List; /** * 双向链表简单实现 * @author 240094626 */ public class LinkedList implements List { /**头节点(空的)*/ private Node header = new Node(null, null, null); /**链表节点长度*/ private int size = 0; /** * 无参构造函数,初始化header节点,前后均指向header节点,形成环形链表 * 环形链表:为了使链表节点的开头是header,结尾也是header; * 由于实现了List,那么链表就是有序的,根据下标查询时可借助环形特点双向查找,提升效率; */ public LinkedList() { header.next = header.pre = header; } /** * 将Object o 添加到 节点n之前 * @param o * @param n */ private void addBefore(Object o, Node n) { Node newNode = new Node(o, n.pre, n); newNode.next.pre = newNode; newNode.pre.next = newNode; size++; } /** * 根据下标位置查找结点 * @param index * @return */ private Node getNode(int index) { if(index < 0 || index >= size){ throw new IndexOutOfBoundsException("index:"+index); } // 查找从header开始 Node n = header; if(index <= (size >> 1)){ // 往next方向找第index个节点 for(int i=0; i <=index; i++){ n = n.next; } }else{ // 往pre方向找第size-index个节点 for(int i=size-index; i >0; i--){ n = n.pre; } } return n; } /** * 移除节点,从当前节点的前后节点间删除当前节点 * @param n * @return */ private Object remove(Node n){ if(n == header){ throw new NoSuchElementException("未找到节点"); } Object result = n.data; n.pre.next = n.next; n.next.pre = n.pre; n.data = null; size--; return result; } @Override public void add(Object o) { // 默认往header前添加 addBefore(o,header); } @Override public void add(int index, Object o) { addBefore(o,index==size?header:getNode(index)); } @Override public Object get(int index) { Node n = getNode(index); return n.data; } @Override public Object remove(int index) { return remove(getNode(index)); } @Override public int size() { return size; } /** * 环形链表结构,header.next就是第一个节点 * @param o */ public void addFirst(Object o){ addBefore(o, header.next); } /** * 环形链表结构,header.pre就是最后一个节点 * @param o */ public void addLast(Object o){ addBefore(o, header); } public Object removeFirst(){ return remove(header.next); } public Object removeLast(){ return remove(header.pre); } public Iterator iterator(){ return new LinkedListIterator(); } @Override public String toString() { Iterator it = iterator(); StringBuilder sb = new StringBuilder(); while(it.hasNext()){ if(sb.length() > 0){ sb.append(","); } sb.append(it.next()); } return "LinkedList {nodes=[" + sb + "], size=" + size + "}"; } private static class Node{ Object data; Node pre; Node next; /** * 链表节点,带参构造函数 * @param data 节点内容 * @param pre 上一个节点 * @param next 下一个节点 */ public Node(Object data, Node pre, Node next) { super(); this.data = data; this.pre = pre; this.next = next; } @Override public String toString() { return "Node {data=" + data + "}"; } } private class LinkedListIterator implements Iterator{ int index ; public LinkedListIterator() { index = 0; } @Override public boolean hasNext() { if(index < size){ return true; } return false; } @Override public Object next() { Node n = getNode(index++); return n.data; } } }