自己實現Java中基於雙向連結串列的LinkedList
阿新 • • 發佈:2019-02-11
以下程式碼完全原創,如有紕漏或不足,請指出,多謝。
用於實現雙向連結串列的節點物件,程式碼如下:
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;
}
}