package com.coding.basic; import java.util.NoSuchElementException; public class LinkedList implements List { private Node head; private int size; private Node tail; public void add(Object obj){ linkLast(obj); } public void add(int index , Object obj){ if (index<0 || index>size) throw new IndexOutOfBoundsException(); else { if (index == size) linkLast(obj); else { Node node = linkIndex(index);//获取指定index的Node Node pred = node.prev; Node newNode = new Node(node.prev,obj,node); node.prev = newNode; if (pred==null) head = newNode; else node.prev.next = newNode;//原链表指定节点前一个的节点的next指向新节点 size++; } } } public Object get(int index){ return linkIndex(index); } public Object remove(int index){ Node node = linkIndex(index);//获取指定index的Node Node prev = node.prev; Node next = node.next; if (prev==null) { //此时删除的节点为头节点 head = next; } else { prev.next = next; node.prev = null; } if (next==null) { //此时删除节点为尾节点 tail = prev; } else { next.prev = prev; node.next = null; } node.data = null; size--; return node; } public int size(){ return size; } public void addFirst(Object o){ Node newNode = new Node(null,o, head); if (head == null) { head = newNode; } else { newNode.next = head; } size++; } public void addLast(Object o){ Node newNode = new Node(head,o, null); if (head == null) { head = newNode; } else { newNode.next = head; } size++; } public Object removeFirst(){ if (head == null) { throw new NoSuchElementException(); } else { Node next = head.next; Object obj = head.data; head.next = null; head.data = null; head = next; if (next == null) { tail = null; } else { next.prev = null; } size--; return obj; } } public Object removeLast(){ tail = tail.prev; head.next = null; head.data = null; return tail; } public Iterator iterator(){ return null; } /** * 尾部添加一个节点 * @param obj */ private void linkLast(Object obj){ Node newNode = new Node(tail,obj, null); if (tail == null) { head = newNode; tail = newNode; } else tail.next = newNode; size++; } /** * 获取指定index索引的Node节点 * @param index * @return */ private Node linkIndex(int index){ Node n = head; for (int i=0;i<index;i++) n = n.next; return n; } private static class Node{ Object data; Node prev; Node next; Node(Node prev,Object obj, Node next){ this.prev = prev; this.data = obj; this.next = next; } } }