public class LinkedList<E> {
private Node<E> first;
private Node<E> last;
private int size;
private class Node<E> {
private Node<E> prev;
private Node<E> next;
E element;
public Node(Node<E> prev, E e, Node<E> next) {
this.prev = prev;
this.element = e;
this.next = next;
}
}
/**
* 添加頭節點
*/
public void addFirst(E e) {
final Node<E> oldFirst = first;
final Node<E> newNode = new Node(null, e, oldFirst);
first = newNode;
if (first == null) {
first = newNode;
} else {
oldFirst.prev = first;
}
size++;
}
/**
* 添加末尾節點
*
* @param e
*/
public void addLast(E e) {
final Node<E> oldLast = last;
final Node<E> newNode = new Node(oldLast, e, null);
last = newNode;
if (first == null) {
first = newNode;
} else {
oldLast.next = newNode;
newNode.prev = oldLast;
}
size++;
}
/**
* 添加
*
* @param e
* @return
*/
public boolean add(E e) {
addLast(e);
return true;
}
public void add(int index, E e) {
check(index);
if (index == size) {
addLast(e);
} else {
Node<E> succ = node(index);// 當前節點
Node<E> pred = succ.prev;// 前一個節點
Node<E> newNode = new Node<>(pred, e, succ);// 確定插入的節點
if (pred == null) {
first = newNode;
} else {
succ.prev = newNode;// 當前節點的前驅
pred.next = newNode;// 前一個節點的後繼
}
size++;
}
}
/**
* @param index
* 刪除當前元素
*/
public void remove(int index) {
Node<E> r = node(index);// 要刪除的節點
Node<E> pred = r.prev;// 前一個節點
Node<E> next = r.next;// 下一個節點
if (pred == null) {// 刪除的是頭節點
first = next;
size--;
return;
}
if (next == null) {// 刪除的是尾節點
last = pred;
size--;
return;
}
// 空出當前節點
pred.next = next;
next.prev = pred;
// r.next = null;
// r.prev = null;
r.element = null;
size--;
}
/**
* @param index
* 二分法獲取當前的節點
*/
private Node<E> node(int index) {
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++) {
x = x.next;
}
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--) {
x = x.prev;
}
return x;
}
}
/**
* @param index
* 檢查插入索引是否合法
*/
private void check(int index) {
if (index < 0 || index > size) {
System.out.println("插入位置不合法");
return;
}
}
/**
* @return 鏈表的長度
*/
public int size() {
return this.size;
}
public E get(int index) {
return node(index).element;
}
private class Iterator {
private Node<E> lastReturn;
private Node<E> next;// 當前節點指向
private int cursor;// 遊標
public Iterator(int index) {
next = (index == size) ? null : node(index);
cursor = index;
}
public boolean hasNext() {
return cursor != size;
}
public E next() {
int i = cursor;
lastReturn = next;
next = next.next;
cursor = i + 1;
return lastReturn.element;
}
}
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>();
list.add(1);
list.add(13);
list.add(5);
list.add(31);
list.add(2);
list.add(5, 4);
list.remove(0);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("-------");
System.out.println(list.size());
System.out.println("-------");
for(LinkedList.Iterator i= list.new Iterator(0);i.hasNext();){
System.out.println(i.next());
}
}
}
LinkedList底層原理(雙向鏈表)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.