寫一個簡單的Linkedlist,實現增刪改查
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;
}
}
相關文章
- Java實現簡單的增刪改查操作Java
- Mybatis-plus實現簡單增刪改查MyBatis
- 使用Mongoose類庫實現簡單的增刪改查Go
- CoreData - 簡單 增刪改查
- 單連結串列實現增刪改查
- 第一個mybatis程式,實現增刪改查CRUDMyBatis
- layui+ssm簡單增刪改查UISSM
- Node+Express+MySql實現簡單增刪改查和登入ExpressMySql
- Golang中map的三種宣告方式和簡單實現增刪改查Golang
- js實現表格的增刪改查JS
- Django基於類的增刪改查,簡單邏輯都不用寫Django
- 單表增刪改查
- Go實現對MySQL的增刪改查GoMySql
- 運用layui實現增刪改查UI
- 一個簡單的Node-React-Koa使用者管理增刪改查小demoReact
- 利用Express+MySQL進行簡單的增刪改查ExpressMySql
- 最簡單的sql語句(增刪改查統計)SQL
- jQuery實現購物車的增刪改查jQuery
- 使用Django開發簡單介面:文章增刪改查Django
- [增刪改查] 最簡單的 JPA 一對多/多對一 CRUD 設計
- Mapper三種形式、工具類以及簡單的增刪改查APP
- mybatis實現MySQL資料庫的增刪改查MyBatisMySql資料庫
- 免費教你寫增刪改查介面
- 增刪改查
- iOS CoreData (一) 增刪改查iOS
- Node.js+Express+Mysql 實現增刪改查Node.jsExpressMySql
- Entity Framework使用DBContext實現增刪改查示例FrameworkContext
- 封裝模組實現商品增刪改查封裝
- [.NET學習]EFCore學習之旅 -2 簡單的增刪改查
- 列表的增刪改查
- 字典的增刪改查
- layui的增刪改查UI
- mybatis的增刪改查MyBatis
- redist的增刪改查Redis
- Node+Vue實現對資料的增刪改查Vue
- 關於ToDolist 的增刪改查 用jQuery來實現jQuery
- SSM整合_年輕人的第一個增刪改查_查詢SSM
- webpack4+express+mongodb+vue 實現增刪改查WebExpressMongoDBVue