linkedList手寫
package connection;
/**
* linkedList底層實現
* 採用連結串列儲存 雙向連結串列
* 重要點 就有first節點 和last節點
* first節點 查詢起始點,last節點插入刪除起始點(這樣就不要去遍歷整個連結串列了,但是隻對於那種在最末端插入刪除的情況)
* first和last也是提高了一定的效率
*
* @author 蔣子文
*
*/
public class MyLinkedList {
Entry first = new Entry();
Entry last = new Entry();
int size = 0;
class Entry{
Object data;
Entry next;
Entry prev;
}
public void add(Object data) {
if(this.size == 0) {
//如果是第一個的話 做一下操作
Entry entry = new Entry();
entry.data = data;
first = entry;
last = entry;
this.size++;
}
else {
//不是第一個插入的話就直接插入就好了
Entry entry = new Entry();
entry.data = data;
entry.prev = last;
last.next = entry;
last = entry;
this.size++;
}
}
//指定位置 新增元素
public void add(int index , Object data) {
Entry entry = new Entry();
entry.data = data;
if(!isData(index)) {
entry = null;
return;
}
/*
* 當然這裡還是應該判斷一下是不是首尾位置
*/
else if(index == 0){
entry.next = first;
first.prev = entry;
first = entry;
this.size++;
}
else if(index == this.size-1) {
add(data); //直接呼叫方法新增
}
else {
Entry oldEntry = new Entry();
oldEntry = first;
for(int i=0; i<=index-1 ; i++) {
oldEntry = oldEntry.next;
}
//左邊連線起來
oldEntry.prev.next = entry;
entry.prev = oldEntry.prev;
//右邊連線起來
entry.next = oldEntry;
oldEntry.prev = entry;
this.size++;
}
}
//通過下標去得到對應的值
public Object get(int index) {
//不合法下標返回null
if(!isData(index)) {
return null;
}
else {
Entry entry = new Entry();
entry = first;
//迴圈找到位置
for(int i=0; i<index-1; i++) {
entry = entry.next;
}
return entry.data;
}
}
//刪除最後一個元素
public void remove() {
//如果沒有元素
if(this.size == 0) {
return ;
}
//如果只有一個元素
else if(this.size == 1) {
first = null;
last = null;
this.size --;
}
else {
last = last.prev;
this.size --;
}
}
//指定位置刪除元素
public void remove(int index) {
if (!isData(index)) {
return;
}
//加一個判斷 是不是最後一個index 因為這不能直接刪 我們不能沒有last節點
else if(index == this.size-1){
//last就是最後一個元素的標記 只要把last節點向前移一個就可以
System.out.println(this.size);
last = last.prev;
this.size --;
}
//加一個判斷 不能直接刪掉第一個元素
else if(index == 0){
//first是開始節點是標記 然後只要將first向後移一位
first = first.next;
this.size --;
}else {
Entry entry = first;
for(int i=0; i<index; i++) {
//System.out.println(i);
entry = entry.next;
}
//這是重點 刪除中間節點
entry.next.prev = entry.prev;
entry.prev.next = entry.next;
this.size --;
}
}
public void print() {
Entry entry = first;
while(entry!=last.next) {
System.out.println(entry.data);
entry = entry.next;
}
}
public boolean isData(int index) {
return index < this.size && index >= 0;
}
public static void main(String[] args) {
MyLinkedList list = new MyLinkedList();
list.add("123");
list.add("456");
list.add("789");
list.add("000");
list.add(1,"123");
list.remove(3);
System.out.println(list.get(2));
list.print();
}
}