鏈表
鏈表是一種動態線性結構,與數組相比鏈表最大的特點是可以不受到長度的限制。
鏈表(動態數組)的本質是利用對象引用的邏輯關係來實現類似於數組的數據存儲邏輯,一個鏈表上由若干個節點(Node)所組成,每一個節點依靠對上一個節點的引用形成一個“鏈”的形式
Node類結構
數組本身是需要進行多個數據的信息保存,但是數據本身並不能夠描述出彼此間的先後順序,所以就需要將數據包裝在節點(Node)之中,每一個節點除了要保存數據信息之外,一定還要保存有下一個節點(Node)的引用,而在鏈表之中會保存有一系列的節點對象
範例:直接使用Node類存放多個數據
public class Node274<E> { //定義節點類保存數據和節點引用
private E data; //節點保存數據
private Node274<E> next; //節點保存數據
public Node274(E data) { //創建節點時保存數據
this.data=data;
}
public E getData() { //獲取數據信息
return this.data ;
}
public Node274<E> getNext() { //設置節點引用
return next;
}
public void setNext(Node274<E> next) { //返回節點
this.next = next;
}
}
public class LinkDemo274 {
public static void main(String[] args) {
Node274<String> n1=new Node274<String>("火車頭");//定義節點對象
Node274<String> n2=new Node274<String>("車廂一");//定義節點對象
Node274<String> n3=new Node274<String>("車廂二");//定義節點對象
Node274<String> n4=new Node274<String>("車廂三");//定義節點對象
Node274<String> n5=new Node274<String>("車廂四");//定義節點對象
n1.setNext(n2); //設置節點引用
n2.setNext(n3); //設置節點引用
n3.setNext(n4); //設置節點引用
n4.setNext(n5); //設置節點引用
printNode(n1); //輸出節點信息
}
public static void printNode(Node274<?> node) { //從頭輸出全部節點
if(node!=null) { //當前節點存在
System.out.println(node.getData()+"、"); //輸出節點順序
printNode(node.getNext()); //遞歸調用,輸出後續節點內容
}
}
}
執行結果
火車頭、車廂一、車廂二、車廂三、車廂四、
本程序直接利用節點的引用關係,將若干個Node類的對象串聯在一起,這樣在進行數據獲取時只需根據引用邏輯,從第一個節點開始利用遞歸邏輯向後一直輸出即可。
上圖中,爲了方便鏈表類中對於數據的保存,將Node類設計爲了一個內部類的形式,目的是讓Node
類只爲LinkImpl一個類服務,這樣就可以形成以下的鏈表基本模型。
範例:定義鏈表的基本模型
public interface ILink<E> { //鏈表公共標準
//在此處定義若干鏈表操作方法
}
public class Link<E> implements ILink<E> {
//使用內部類的結構進行定義,這樣外部類與內部類可以直接進行私有成員訪問
private class Node<E>{ //內部類封裝,對外部不可用
private E data; //節點保存數據
private Node<E> next; //保存節點引用
public Node(E data){ //創建節點時保存數據
this.data =data;
}
}
}
ILink接口主要方法