1. 程式人生 > >自己實現Java中基於雙向連結串列的LinkedList

自己實現Java中基於雙向連結串列的LinkedList

以下程式碼完全原創,如有紕漏或不足,請指出,多謝。

    用於實現雙向連結串列的節點物件,程式碼如下:
package custom.node;

public class Node<E> {
    //節點中的資料
    private E e;
    //指向的下一個節點
    private Node<E> next;
    //指向前一個的節點
    private Node<E> prev;

    public Node() {
        super();
    }

    public Node(Node<E> prev,E e,Node<E> next) {
        super();
        this
.e = e; this.next = next; this.prev = prev; } public E getE() { return e; } public void setE(E e) { this.e = e; } public Node<E> getNext() { return next; } public void setNext(Node<E> next) { this.next = next; } public
Node<E> getPrev() { return prev; } public void setPrev(Node<E> prev) { this.prev = prev; } }

自己實現的LinkedList,和JDK原始碼有些類似,只實現了JDK中LinkedList類中常用幾個方法,程式碼如下:

package custom.list;
import custom.node.Node;
public class LinkedList<E>{

    // 第一個節點
    private
Node<E> first; // 最後一個節點 private Node<E> last; // 集合的大小 private int size = 0; public LinkedList() { super(); } /** * 獲取集合的大小 */ public int size() { return size; } /** * 判斷傳入的索引是不是集合中的有效索引 */ private boolean isElementIndex(int index) { return index >= 0 && index < size; } /** * 刪除指定索引處的元素 返回刪除的元素 */ public E remove(int index) { if (!isElementIndex(index)) { throw new IndexOutOfBoundsException(); } Node<E> indexNode = this.getNode(index); E e = indexNode.getE(); Node<E> prev = indexNode.getPrev(); Node<E> next = indexNode.getNext(); if (prev != null) { prev.setNext(next); } if (next != null) { next.setPrev(prev); } indexNode = null; size--; return e; } /** * 刪除最後一個索引處的元素 返回被刪除的元素 */ private E removeLast() { Node<E> prev = last.getPrev(); // 獲取倒數第二個節點 prev.setNext(null); size--; return last.getE(); } /** * 刪除第一個元素 */ private E removeFirst() { Node<E> f = first; Node<E> second = f.getNext(); second.setPrev(null); first = second; size--; return f.getE(); } /** * 獲取指定索引處的值(索引從0開始) */ public E get(int index) { return this.getNode(index).getE(); } /** * 獲取指定索引處的節點 */ public Node<E> getNode(int index) { // 校驗傳入的資料 if (index >= size || index < 0) { throw new ArrayIndexOutOfBoundsException(); } Node<E> target = first; for (int i = 0; i < index; i++) { target = target.getNext(); } return target; } /** * 返回列表中某元素第一次出現的索引 */ public int indexOf(Object o) { for (int i = 0; i < size; i++) { E e = get(i); if (o == e) { return i; } } return -1; } /** * 替換指定索引處的元素 返回以前在該位置上的索引 */ public E set(int index, E ele) { // 判斷索引是不是合法索引 if (isElementIndex(index)) { throw new IndexOutOfBoundsException(); } Node<E> node = getNode(index); Node<E> prev = node.getPrev(); Node<E> next = node.getNext(); if (prev != null) { prev.setNext(node); } if (next != null) { next.setPrev(node); } node.setPrev(prev); node.setNext(next); return node.getE(); } /** * 移除集合中所有的元素, 將集合中每一個節點都設定空節點 */ public void clear() { // 從第一個節點開始遍歷 for (Node<E> x = first; x != null;) { Node<E> next = x.getNext(); x.setE(null); x.setNext(null); x.setPrev(null); x = next; } first = last = null; size = 0; } /** * 新增元素 */ public boolean add(E e) { // 將要新增的資料放在節點中 Node<E> node = new Node<>(last, e, null); if (first == null) { // 第一次新增 first = node; last = first; } else { // 集合中已經有資料了 last.setNext(node); last = node; } size++; return true; } }