寫一個簡單的Linkedlist,實現增刪改查

go_____________ahead發表於2018-11-22

linkedlist和arraylist一樣都是實現了list,只是它們底層不同,一個是陣列一個是連結串列,就造就了它們的一些特性不同

linkedlist增刪快,查詢慢。主要是因為連結串列查詢要將連結串列遍歷一邊找到該資料輸入。當要刪除時,只需要將其結點的前後兩個結點連線起來即可

package Array;

import java.util.NoSuchElementException;

public class MyLinkedList<T> {
private class Node<T>{
	T t;
	Node<T> next;//後繼
	Node<T> prev;//前驅
	Node(T t){
		this.t=t;
	}
}
Node<T> frist;
Node<T> last;
int size;//連結串列長度
public MyLinkedList() {
	frist=last=null;
}
//加一個元素
public void add(T t) {
	Node<T> n=new Node<T>(t);
	if(last==null) {
		frist=n;
		last=n;
	}else {
	last.next=n;//最後一個元素下一個為此次新增的元素
	n.prev=last;//新增元素的前驅指前一個元素
	last=n;//此時最後一個元素為剛新增進入的
	}
	size++;
}
//新增元素到第一個
public void addFrist(T t) {
	Node<T> f=new Node<T>(t);	
	if(last==null) {
		frist=f;
		last=f;
	}else {
	f.next=frist;
	frist.prev=f;
	frist=f;
	}
	size++;
}
//將元素新增到最後一個位置
public void linkedFrist(T t) {
	add(t);
}
//刪除第一個元素
public void deleteFrist() {
	if(size<1) {
		throw new NoSuchElementException("linked為空,無法進行此操作");
	}
 frist.next.prev=null;
 frist=frist.next;
 size--;
}
//刪除最後一個元素
public void deleteLast() {
	if(size<1) {
		throw new NoSuchElementException("linked為空,無法進行此操作");
	}
last=last.prev;
last.next=null;
size--;
}
//刪除指定元素
public void delete(T t) {
	Node<T> n=findNode(t);
	n.prev.next=n.next;
	n.next.prev=n.prev;
	size--;
}
//刪除指定位置的元素
public void delete(int index) {
	Node<T> n=findex(index);
	n.prev.next=n.next;
	n.next.prev=n.prev;
	size--;
}
//將更改第一個元素,返回其原來的元素
public T setFrist(T t) {
	T t1=frist.t;
	frist.t=t;
	return t1;
}
//更改最後一個元素
public T setLast(T t) {
	T t1=last.t;
	last.t=t;
	return t1;
}
//更改指定位置的元素,返回該位置的元素
public T set(int index,T t) {
	Node<T> n=findex(index);//獲取這個位置的結點
	T t1=n.t;
	n.t=t;
	return t1;
}
//獲取第一個元素
public T getFrist() {
	if(size()==0) {
		throw new NoSuchElementException("linkedlist為空,無法進行此操作");
	}
	return frist.t;
}
//獲取最後一個元素
public T getLast() {
	if(size()==0) {
		throw new NoSuchElementException("linkedlist為空,無法進行此操作");
	}
	return last.t;
}
//獲取指定位置的元素
public T get(int index) {
	Node<T> n=findex(index);
	return n.t;
}
//輸入指定元素,獲取其結點
private Node<T> findNode(T t){
	Node<T> n=frist;
	for(int i=0;i<size;i++) {
		if(n.t.equals(t)) {
			return n;
		}
		n=n.next;
	}
	throw new NoSuchElementException("linkedlist無此元素,無法進行此操作");
}
//輸入指定位置,獲取其結點
private Node<T> findex(int index) {
	if(index<1||index>size()) {
		
		throw new NoSuchElementException("linkedlist輸入錯誤,無法進行此操作:"+index);
	}
	Node<T> n=frist;
	for(int i=0;i<size;i++) {
		if(i==index-1) {
			return n;
		}
		n=n.next;
	}
	return null;
}
//判斷是否為空
public boolean isEmpty() {
	return size()==0;
}
//判斷長度
public int size() {
	return size;
}
}

 

相關文章