標籤:資料結構 java linkedlist iterator 資料
以下是一個可以使用的LinkedList泛型類的實現。這裡的鏈表類名為MyLinkedList,避免與類庫中重複。
MyLinkedList將作為雙鏈表實現,而且保留到該表兩端的引用。這樣只要操作發生在已知的位置,就可以保持每個操作花費常數時間的代價。這個已知的位置可以是端點,也可以是由迭代器指定的一個位置。
設計方面,主要分為三個部分實現:
- MyLinkedList類本身,包含到兩端的鏈、表的大小以及一些方法。
- Node類,它可能是一個私人的嵌套類。一個節點包含資料以及到前一個節點的鏈和到下一個節點的鏈,還有一些適當的構造方法。
- LinkedListIterator類,該類抽象了位置的概念,是一個私人類,並實現介面Iterator。包含方法next(),hasNext(),remove()的實現。
import java.util.ConcurrentModificationException;import java.util.Iterator;import java.util.NoSuchElementException;public class MyLinkedList<AnyType> implements Iterable<AnyType> {private int theSize;private int modCount = 0;private Node<AnyType> beginMarker;private Node<AnyType> endMarker;private static class Node<AnyType> {public AnyType data;public Node<AnyType> prev;public Node<AnyType> next;public Node(AnyType d, Node<AnyType> p, Node<AnyType> n) {data = d;prev = p;next = n;}}public MyLinkedList() {clear();}public void clear() {beginMarker = new Node<AnyType>(null, null, null);endMarker = new Node<AnyType>(null, beginMarker, null);beginMarker.next = endMarker;theSize = 0;modCount++;}public int size() {return theSize;}public boolean isEmpty() {return size() == 0;}public void add(AnyType x) {add(size(), x);}public void add(int idx, AnyType x) {addBefore(getNode(idx), x);}public AnyType get(int idx) {return getNode(idx).data;}public AnyType set(int idx, AnyType newVal) {Node<AnyType> p = getNode(idx);AnyType oldVal = p.data;p.data = newVal;return oldVal;}public AnyType reomve(int idx) {return remove(getNode(idx));}private void addBefore(Node<AnyType> p, AnyType x) {Node<AnyType> newNode = new Node<AnyType>(x, p.prev, p);newNode.prev.next = newNode;p.prev = newNode;theSize++;modCount++;}private AnyType remove(Node<AnyType> p) {p.next.prev = p.prev;p.prev.next = p.next;theSize--;modCount++;return p.data;}private Node<AnyType> getNode(int idx) {Node<AnyType> p;if (idx < 0 || idx > size()) {throw new IndexOutOfBoundsException();}if (idx < size() / 2) {p = beginMarker.next;for (int i = 0; i < idx; i++) {p = p.next;}} else {p = endMarker;for (int i = size(); i < idx; i--) {p = p.prev;}}return p;}public Iterator<AnyType> iterator() {return new LinkedListIterator();}private class LinkedListIterator implements Iterator<AnyType> {private Node<AnyType> current = beginMarker.next;private int expectedModCount = modCount;private boolean okToRemove = false;@Overridepublic boolean hasNext() {return current != endMarker;}@Overridepublic AnyType next() {if (modCount != expectedModCount) {throw new ConcurrentModificationException();}if (!hasNext()) {throw new NoSuchElementException();}AnyType nextItem = current.data;current = current.next;okToRemove = true;return nextItem;}public void remove() {if (modCount != expectedModCount) {throw new ConcurrentModificationException();}if (!okToRemove) {throw new IllegalStateException();}MyLinkedList.this.remove(current.prev);okToRemove = false;expectedModCount++;}}}
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
資料結構(Java語言)——LinkedList