資料結構(Java語言)——LinkedList

來源:互聯網
上載者:User

標籤:資料結構   java   linkedlist   iterator   資料   

以下是一個可以使用的LinkedList泛型類的實現。這裡的鏈表類名為MyLinkedList,避免與類庫中重複。

MyLinkedList將作為雙鏈表實現,而且保留到該表兩端的引用。這樣只要操作發生在已知的位置,就可以保持每個操作花費常數時間的代價。這個已知的位置可以是端點,也可以是由迭代器指定的一個位置。

設計方面,主要分為三個部分實現:

  1. MyLinkedList類本身,包含到兩端的鏈、表的大小以及一些方法。
  2. Node類,它可能是一個私人的嵌套類。一個節點包含資料以及到前一個節點的鏈和到下一個節點的鏈,還有一些適當的構造方法。
  3. 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.