LinkedList底層簡化版實現
阿新 • • 發佈:2018-12-09
public class MyLinkedList {
//MyLinkedList儲存資料個數
int size;
//首節點
Node first;
//尾節點
Node last;
//新增資料
public boolean add(Object o) {
Node node = new Node(last, o, null);
//如果尾節點為空,即MyLinkedList沒有資料把新增的資料設定為首節點否則把已有的尾節點的next指向該資料
if (last == null) {
first = node;
} else {
last.next = node;
}
//新新增的資料設定為節點之後,把該節點設定為尾節點
last = node;
//長度++
size++;
return true;
}
//刪除資料
public Object remove(int index) {
//通過下標獲得要刪除節點獲取其中資料,值、前一個節點、後一個節點
Node node = node(index);
Object value = node.value ;
Node pro = node.pro;
Node next = node.next;
//驗證下標合法性
if (index >= 0 && index < size) {
//如果該節點沒有前一個節點,即該節點為首節點,將該節點的下一個節點設定為首節點
if (pro == null) {
next.pro = null;
node.next = null;
first = next;
}
//如果該節點沒有下一個節點,即該節點為為節點,將該節點的上一個節點設定為尾節點
else if (next == null) {
pro.next = null;
node.pro = null;
last = pro;
}
//如果該節點既不是首節點也不是尾節點,將該節點的上一個節點的next指向該節點的下一個節點,將該節點的下一個節點的pro指向該節點的上一個節點
else{
pro.next = next;
next.pro = pro;
}
//最後將該節點置空,長度減一
node = null;
size--;
} else {
System.out.println("不存在該序號元素");
}
return value;
}
//修改
public void set(int index, Object o) {
if (index >= 0 && index < size) {
Node node = node(index);
node.value = o;
}else {
System.out.println("不存在該序號元素");
}
}
public Object get(int index){
return node(index).value;
}
//查詢
public Node node(int index) {
//當查詢的下標小於長度一半時從尾部從頭部遍歷,否則從尾部遍歷
if (index < (size >> 1)) {
Node x = first;
for (int i = 0; i < index; i++) {
x = x.next;
}
return x;
} else {
Node x = last;
for (int i = size - 1; i > index; i--) {
x = x.pro;
}
return x;
}
}
class Node {
Object value;
Node pro;
Node next;
public Node(Node pro, Object value, Node next) {
super();
this.value = value;
this.pro = pro;
this.next = next;
}
}
}