package week3.linkedlist; import java.util.Iterator; /** * Created by zndbl on 2017/3/29. */ public class MyLinkedLists { private Node head; private int size; /** * 删除第一个 * * @return */ public Node removeFirst() { Node node = head; head = node.getNext(); size--; return node; } /** * 删除最后一个 * * @return */ public Node removeLast() { Node node = head; Node pre = null; while (node != null) { pre = node; node = node.getNext(); } pre.setNext(null); size--; return pre; } /** * 新增节点在第一个 * * @param data */ public void addFirst(Object data) { Node node = new Node(data); node.setNext(head); head = node; size++; } /** * 得到指定索引的节点 * * @param index * @return */ public Node getNode(int index) { index++; Node node = null; for (int i = 0; i < index; i++) { node = head; node = node.getNext(); } return head; } /** * 删除指定索引的节点 * * @param index * @return */ public Node removeNode(int index) { Node prevNode = getNode(index--); Node currNode = getNode(index); Node succNode = currNode.getNext(); prevNode.setNext(succNode); currNode = null; size--; return succNode; } /** * 在最后添加一个节点 * * @return */ public Node addLast(Object data) { Node node = new Node(data); Node curr = head; Node succ = null; while (curr != null) { succ = curr; curr = curr.getNext(); } succ.setNext(node); size++; return node; } /** * 在指定索引增加 * * @param index * @param obj */ public void add(int index, Object obj) { Node curr = head; Node prev = null; while (curr != null) { if (index == 0) { break; } prev = curr; curr = curr.getNext(); index--; } if (prev != null) { Node node = new Node(obj); node.setNext(curr); prev.setNext(node); } } /** * 得到大小 * * @return */ public int size() { return size; } /** * 得到迭代器 * * @return */ public Iterator iterator() { return new MyLinkedListsIterator(this); } /** * 反转节点 */ public void reverse() { Node prev = null; Node next = null; Node curr = head; while (curr != null) { next = curr.getNext(); curr.setNext(prev); prev = curr; curr = next; } head = prev; } /** * 链表头一半删除 */ public void removeFirstHalf() { Node curr = head; int half = size / 2; while (half != 0) { curr = curr.getNext(); half--; } head = curr; } /** * 指定索引,指定长度的删除 * * @param i * @param length */ public void remove(int i, int length) { if (i + length >= size - 1) { length = size - 1 - i; } int count = i; Node pre = null; Node curr = head; while (curr != null) { if (count == 0) { break; } pre = curr; curr = curr.getNext(); count--; } while (curr != null) { if (length == 0) { break; } curr = curr.getNext(); length--; } pre.setNext(curr.getNext()); } /** * 打印方法 * @return */ public String toString() { StringBuilder builder = new StringBuilder(); Node current = head; while (current == null) { builder.append(current.toString()); current = current.getNext(); } return builder.toString(); } private class MyLinkedListsIterator implements Iterator { private MyLinkedLists linkedList; private int length = 0; public MyLinkedListsIterator(MyLinkedLists linkedList) { this.linkedList = linkedList; } @Override public boolean hasNext() { return length < size; } @Override public Object next() { return linkedList.getNode(length++); } @Override public void remove() { linkedList.removeNode(length--); } } public static class Node { private Object data; private Node next; public Node(Object data) { this.data = data; } public void setNext(Node next) { this.next = next; } public Node getNext() { return next; } public Object getData() { return this.data; } public String toString() { return "data = "+data; } } }