1. 程式人生 > >來啊~手寫個連結串列啊~

來啊~手寫個連結串列啊~

??在儲存一大波資料的時候,我們最常用的可能是陣列,但是有時候陣列就是不夠靈活。

比如說,有一大串資料,如果中間插入一個數字的話,就要將後面的數字往後一個一個挪,怎麼挪呢~

1、開刀:把陣列在特定的位置截開 2、新建:建立一個新的足夠長的定長陣列 3、縫合:依次將前半段、那個數字、後半段縫合

這樣的操作明顯是很消耗時間的,如果使用連結串列就快很多啦,因為連結串列只需要將前後兩段的關聯切開,中間插入資料,然後再縫合兩邊聯絡就可以了。

來啊,手寫連結串列啊

首先,手寫連結串列要注意的關鍵就是聯絡的切開和縫合。 在這裡,我們會嘗試用Java陣列來實現簡單的單向連結串列。

?主要思路:

  1. 建立陣列: 建立兩個等長的陣列(data、right),長度為初始資料的2倍(防止後續做增強操作時下標越界)
  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陣列實現向右指標的連結,那向左呢?估計你已經有一個很好的思路去實現雙向連結串列了,根據下標查詢數值,更不在話下了,想想這個,是不是有點類似我們的裝飾者模式?

?好了,結束了,給點個贊不?