模擬實現連結串列結構的增刪改查的操作
public class MyLink<T> {
//連結串列的長度
private long length = 0;
//連結串列的第一個值的位置
private Node first = null;
//連結串列的最後一個值的位置
private Node last = null;
//連結串列的值(內部類的模式) T代表值的型別
private class Node<T>{
//T型別的值data
T data;
//值的下一個位置
Node next;
//初始化的建構函式
public Node(T data){
this.data = data;
}
}
//向連結串列中新增一個值,預設新增到末尾,新增成功返回true
public boolean addLast(T data){//這裡要使用內部類中的型別T,必須在主類上新增響應型別T
if(length ==0||first == null){
//代表連結串列一個元素都沒有,可以直接新增
first = new Node(data);
last = first;
}else{//代表連結串列中有值
Node newNode = new Node(data);
last.next = newNode;
last = newNode;
}
length++;
return true;
}
//在連結串列中刪除一個值
public boolean delete(T data){
//當連結串列為空的,或者沒有元素的時候,代表刪除成功
if(length==0||first==null){
return true;
}
//查詢元素
Node n = first;
//相當於n的父節點(上一級,因為刪除一個元素後,上一級的下一個節點指向刪除元素的下一個節點)
Node parentNode = null;
while(n!=null){
//證明找到
if(n.data==data||n.data.equals(data)){
//如果是第一個元素是要刪除的元素
if(n==first){
first = first.next;
}else{
//n的上一個節點parentNode的下一個節點指向刪除元素n的下一個節點
parentNode.next = n.next;
}
length--;
return true;
}
//沒有找到
//先把父節點儲存起來
parentNode = n;
//然後繼續下一個節點進行查詢
n = n.next;
}
//當迴圈結束,還沒有返回,代表這個連結串列中沒有這個值,刪除失敗
return false;
}
//查詢這個元素是否在連結串列中存在
public boolean seek(T data){
if(first==null||length==0){
return false;
}
Node n = first;
while(n!=null){
//證明找到
if(n.data==data||n.data.equals(data)){
return true;
}
n = n.next;
}
//當迴圈結束,代表超找結束,沒找到這個元素
return false;
}
//插入一個元素到指定元素的的後一位(可能有很多相同的元素,預設只插入到第一個元素的後面)
//引數有兩個,一個是需要插入的元素,一個是插入元素的值的位置
public boolean insertAfter(T existsData,T insertData){
if(existsData==null){
return addLast(insertData);
}
Node n = first;
while(n!=null){
//證明找到
if(n.data==existsData||n.data.equals(existsData)){
Node right = n.next;
Node newNode = new Node(insertData);
n.next = newNode;
newNode.next = right;
length++;
return true;
}
n = n.next;
}
//代表沒有這個元素,無法插入
return false;
}
}