來啊~手寫個連結串列啊~
??在儲存一大波資料的時候,我們最常用的可能是陣列,但是有時候陣列就是不夠靈活。
比如說,有一大串資料,如果中間插入一個數字的話,就要將後面的數字往後一個一個挪,怎麼挪呢~
1、開刀:把陣列在特定的位置截開 2、新建:建立一個新的足夠長的定長陣列 3、縫合:依次將前半段、那個數字、後半段縫合
這樣的操作明顯是很消耗時間的,如果使用連結串列就快很多啦,因為連結串列只需要將前後兩段的關聯切開,中間插入資料,然後再縫合兩邊聯絡就可以了。
來啊,手寫連結串列啊
首先,手寫連結串列要注意的關鍵就是聯絡的切開和縫合。 在這裡,我們會嘗試用Java陣列來實現簡單的單向連結串列。
?主要思路:
- 建立陣列: 建立兩個等長的陣列(data、right),長度為初始資料的2倍(防止後續做增強操作時下標越界)
- 定義陣列: 陣列data儲存連結串列內容,陣列right儲存遊標
說到遊標,聰明的你應該懂我了,主要思路大致這樣:
假設初始資料長度為n,即會建立一個n*2長度的陣列,當我們增加一個數字a到下標b後面,就會將data陣列下標n的0修改為k,而right[b]則會變更為n。那麼 ,手寫連結串列的除了一個值,就是data[right[i]],而第一個值呢,就是data[0]。
複雜?那畫個圖吧~
簡單來說,就是data陣列讀取了第0號位置的資料後,通過下表找到right陣列中對應的值,通過這個值去查詢data表的對應下標,就這樣完成中間的“連結”。
讓我們用Java程式碼實現一下吧。
主要功能: 1 輸入自定義長度的陣列 2 選定在哪個位置插入數字 66 3 輸出結果
import java.util.Arrays; import java.util.Scanner; public class MyList { public static void main(String[] args) { int[]data,right; int i,t ,n; System.out.print("請輸入初始連結串列長度:"); n = new Scanner(System.in).nextInt(); data=new int[n*2]; right=new int[n*2]; System.out.println("請依次輸入相應"+n+"個數字:"); for(i=0;i<n;i++) { data[i]=new Scanner(System.in).nextInt(); //System.out.println(data[i]); if(i<n-1) {right[i]=i+1;}else {right[i]=0;} } System.out.println("初始連結串列內容為:"+Arrays.toString(data)); //System.out.println("指標連結串列內容為:"+Arrays.toString(right)); System.out.print("需要在哪個下標後插入一個66"); t=new Scanner(System.in).nextInt(); while(t<0 || t>n-1) { System.out.print("請在0-"+(n-1)+"中間選擇t:"); t=new Scanner(System.in).nextInt(); } for(i=t+1;i<n+1;i++) {//逐個變更後續right連結 right[i]=i; } data[n]=66; //在data陣列插入66 right[t]=n; //將66對應的下標數字賦予right陣列要插入66的位置 right[n]=0; //確保right陣列最後一個數值是0,用來指引data[0]的位置 //System.out.println("--初始連結串列內容為:"+Arrays.toString(data)); //System.out.println("--指標連結串列內容為:"+Arrays.toString(right)); System.out.print("結果輸出: "); System.out.print(data[right[n]]+" "); for(i=0;i<n;i++) { System.out.print (data[right[i]]+" "); //實現連結串列插入功能 } }
列印輸出的結果: 上面的程式碼能看懂不?來我們根據資料結構畫個圖吧~
?插入前
?插入後
原連結串列內容是12345 後來我們在3號位置後面硬插入一個數字66 那麼,最後輸出的結果是
1 2 3 4 66 5
俗話說,思路最重要,然後你懂沒?
這裡我們用了right陣列實現向右指標的連結,那向左呢?估計你已經有一個很好的思路去實現雙向連結串列了,根據下標查詢數值,更不在話下了,想想這個,是不是有點類似我們的裝飾者模式?
?好了,結束了,給點個贊不?