package com.ikook.basic_data_structure; import java.util.NoSuchElementException; /** * @author ikook; QQ号码: 935542673 */ public class MyLinkedList implements MyList{ private Node first; private Node last; private int size; /** * 在链表的头部插入新的元素 * @param obj */ public void addFirst(Object obj) { final Node f = first; final Node newNode = new Node(null, obj, f); first = newNode; if (f == null) last = newNode; else f.previous = newNode; size++; } /** * 在链表尾部插入新的元素 * @param obj */ public void addLast(Object obj) { final Node l = last; final Node newNode = new Node(l, obj, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; } /** * 在链表中插入新的元素 * @param obj */ public void add(Object obj) { addLast(obj); } /** * 在指定位置插入新的元素 * @param index * @param obj */ public void add(int index, Object obj) { if (!(index >= 0 && index <= size)) { throw new IndexOutOfBoundsException("索引位置越界"); } if (index == size) { addLast(obj); } else { Node temp = node(index); final Node pred = temp.previous; final Node newNode = new Node(pred, obj, temp); temp.previous = newNode; if (pred == null) first = newNode; else pred.next = newNode; size++; } } /** * 返回集合的size。 * @return */ public int size() { return size; } /** * 判断集合是非为空 * @return */ public boolean isEmpty() { return size == 0; } /** * 获取链表头部的元素 * @return */ public Object getFirst() { final Node f = first; if (f == null) { throw new NoSuchElementException("没有找到指定的元素"); } return f.data; } /** * 获取链表尾部的元素 * @return */ public Object getLast() { final Node l = last; if (l == null) { throw new NoSuchElementException("没有找到指定的元素"); } return l.data; } /** * 获取指定位置的元素 * @param index * @return */ public Object get(int index) { rangeCheckElementIndex(index); return node(index).data; } /** * 更改指定位置的元素 * @param index * @param element * @return */ public Object set(int index, Object element) { rangeCheckElementIndex(index); Node temp = node(index); Object oldValue = temp.data; temp.data = element; return oldValue; } /** * 删除链表头部的元素 * @return */ public Object removeFirst() { final Node f = first; if (f == null) { throw new NoSuchElementException("没有找到指定的元素"); } final Object element = f.data; final Node next = f.next; f.data = null; f.next = null; first = next; if (next == null) { last = null; } else { next.previous = null; } size--; return element; } /** * 删除链表尾部的元素 * @return */ public Object removeLast() { final Node l = last; if (l == null){ throw new NoSuchElementException("没有找到指定的元素"); } final Object element = l.data; final Node prev = l.previous; l.data = null; l.previous = null; last = prev; if (prev == null) { first = null; } else { prev.next = null; } size--; return element; } /** * 删除指定元素 * @param o * @return */ public boolean remove(Object o) { if (o == null) { for (Node temp = first; temp != null; temp = temp.next) { if (temp.data == null) { deleteElement(temp); return true; } } } else { for (Node temp = first; temp != null; temp = temp.next) { if (o.equals(temp.data)) { deleteElement(temp); return true; } } } return false; } /** * 删除指定位置的元素 * @param index * @return */ public Object remove(int index) { rangeCheckElementIndex(index); return deleteElement(node(index)); } /** * 删除指定节点元素 * @param temp * @return */ private Object deleteElement(Node temp) { final Object element = temp.data; final Node next = temp.next; final Node prev = temp.previous; if (prev == null) { first = next; } else { prev.next = next; temp.previous = null; } if (next == null) { last = prev; } else { next.previous = prev; temp.next = null; } temp.data = null; size--; return element; } /** * 检查索引元素的范围 * @param index */ private void rangeCheckElementIndex(int index) { if (!(index >= 0 && index < size)) { throw new IndexOutOfBoundsException("索引越界"); } } /** * 返回指定索引位置的节点 * @param index * @return */ Node node(int index) { if (index < (size >> 1)) { Node temp = first; for (int i = 0; i < index; i++) temp = temp.next; return temp; } else { Node temp = last; for (int i = size - 1; i > index; i--) temp = temp.previous; return temp; } } /** * 用于表示一个节点 * @author ikook */ private static class Node { Node previous; // 上一个节点 Object data; Node next; // 下一个节点 public Node(Node previous, Object data, Node next) { this.previous = previous; this.data = data; this.next = next; } } /** * 返回一个迭代器的实现类 * @return */ public MyIterator iterator() { return new LinkIter(); } /** * 迭代器的实现类 * @author ikook */ private class LinkIter implements MyIterator { private Node lastRet; //始终指向刚遍历完的节点 private Node next; // 当前指向的节点 private int nextIndex; //当前节点的索引值 LinkIter () { next = node(0); nextIndex = 0; } @Override public boolean hasNext() { return nextIndex < size; } @Override public Object next() { if(!hasNext()) { throw new NoSuchElementException("没有找到指定的元素, 迭代器遍历失败"); } lastRet = next; next = next.next; nextIndex++; return lastRet.data; } @Override public void remove() { if(lastRet == null) { throw new IllegalStateException("非法状态异常,删除失败"); } Node lastNext = lastRet.next; deleteElement(lastRet); if(next == lastRet) { next = lastNext; } else { nextIndex--; } lastRet = null; } } }