java 手動實現單鏈表(尾插法和頭插法)
頭插法: 頭插法的實現相對簡單 思路是將新形成的節點的下一個賦值為header
再把新形成的節點地址傳給header即將header向前移動
import java.util.Random; import java.util.Scanner; public class Link { //建立一個儲存資料的屬性 int data; //建立儲存下一個節點地址的屬性 Link next; static int length=0; /** * 建立一個連結串列 * @param len 產生資料的長度 * @return 連結串列第一個節點地址 */ public static Link creat(int len){ //定義隨機物件 Random r=new Random(); //定義連結串列的節點 Link newnode,header; //header永遠儲存第一個節點的地址,tailer永遠儲存最後一個節點的地址 header=null; for (int i = 0; i < len; i++) { //生成一個隨機數字 int temp=r.nextInt(100); //建立一個臨時節點 newnode=new Link(); //長度 length++; //為屬性賦值 newnode.data=temp; //判斷當前連結串列是否第一次賦值 if(header==null){ header=newnode; }else{ //將新節點連線到連結串列的頭部 newnode.next=header; //header永遠儲存第一個節點的地址 header=newnode; } } return header; } public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.println("輸入長度:"); int l=sc.nextInt(); System.out.println("列印陣列:"); //呼叫陣列生成方法 傳入鍵盤值l Link head=Link.creat(l); for (int i = 0; i < Link.length; i++) { System.out.print(head.data+" "); //把當前物件的下一個物件地址傳給當前物件 head=head.next; } } }
尾插法: 尾插法相對於頭插法有些許不同 因為要返回頭 頭不能動 所以需要一個tailer來記錄最後一個值 tailer右移
import java.util.Random; import java.util.Scanner; public class Link { //建立一個儲存資料的屬性 int data; //建立儲存下一個節點地址的屬性 Link next; static int length=0; /** * 建立一個連結串列 * @param len 產生資料的長度 * @return 連結串列第一個節點地址 */ public static Link creat(int len){ //定義隨機物件 Random r=new Random(); //定義連結串列的節點 Link newnode,header,tailer; //header永遠儲存第一個節點的地址,tailer永遠儲存最後一個節點的地址 header=tailer=null; for (int i = 0; i < len; i++) { //生成一個隨機數字 int temp=r.nextInt(100); //建立一個臨時節點 newnode=new Link(); //長度 length++; //為屬性賦值 newnode.data=temp; //判斷當前連結串列是否第一次賦值 if(header==null){ header=tailer=newnode; }else{ //將新節點連線到連結串列的尾部 tailer.next=newnode; //tailer永遠儲存最後一個節點的地址 tailer=newnode; } } return header; } public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.println("輸入長度:"); int l=sc.nextInt(); System.out.println("列印陣列:"); //呼叫陣列生成方法 傳入鍵盤值l Link head=Link.creat(l); for (int i = 0; i < Link.length; i++) { System.out.print(head.data+" "); //把當前物件的下一個物件地址傳給當前物件 head=head.next; } } }
這裡可以比較一下兩種方法的不同:
頭插法: if(header==null){ 尾插法: if(header==null){
header=newnode; header=tailer=newnode;
}else{ }else{
//將新節點連線到連結串列的頭部 //將新節點連線到連結串列的尾部
newnode.next=header; tailer.next=newnode;
//header永遠儲存第一個節點的地址 //tailer永遠儲存最後一個節點的地址
header=newnode; tailer=newnode;
} }