線性表鏈?zhǔn)酱鎯Y(jié)構(gòu)Java實現(xiàn)

線性表损话、鏈?zhǔn)酱鎯Y(jié)構(gòu)

線性表是相對于邏輯結(jié)構(gòu)侦啸,鏈?zhǔn)酱鎯Y(jié)構(gòu)是相對于物理存儲。即邏輯上是一個接一個丧枪,物理存儲上是隨機的光涂。

鏈?zhǔn)酱鎯Φ奶攸c

關(guān)鍵字

頭結(jié)點、尾結(jié)點拧烦、數(shù)據(jù)域忘闻、指針

特點

頭結(jié)點:數(shù)據(jù)域為空,指針指向第一個結(jié)點
尾結(jié)點:數(shù)據(jù)與不為空恋博,指針指向空

Java代碼實現(xiàn)

查詢

類結(jié)構(gòu):

  • MyLink
  • SelectLinkList
  • SelectLinkListTest
    MyLink是用來構(gòu)造鏈?zhǔn)酱鎯ο蠓辍electLinkList用來查詢出指定位置的對象、SelectLinkListTest是測試

代碼實現(xiàn)

MyLink.java

public class MyLink {
    /**
     * 數(shù)據(jù)域
     */
    private int data;
    /**
     * 所指向的下一個對象的地址
     */
    private MyLink nextLink;

    public MyLink() {
    }

    public MyLink(MyLink nextLink) {
        this.nextLink = nextLink;
    }

    public MyLink(int data, MyLink nextLink) {
        this.data = data;
        this.nextLink = nextLink;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public MyLink getNextLink() {
        return nextLink;
    }

    public void setNextLink(MyLink nextLink) {
        this.nextLink = nextLink;
    }
}

SelectLinkList.java

public class SelectLinkList {
    /**
     * 用來幫助循環(huán)構(gòu)建MyLink對象
     */
    private MyLink[] links;
    /**
     * 假定傳入MyLink[10]交播,即要創(chuàng)建10個MyLink對象重虑。這10個對象中是不應(yīng)該包含頭節(jié)點的。
     * 因為傳入的數(shù)組中秦士,所有位置都要包含數(shù)據(jù)缺厉;而MyLink的對象中頭節(jié)點的構(gòu)造方法是
     * MyLink(MyLink nextLink),所以在這里拿出來。
     */
    private MyLink myLinkHeader = null;

    /**
     * 為了傳入自定義MyLink[]的長度
     * @param links
     */
    public SelectLinkList(MyLink[] links) {
        this.links = links;
    }

    /**
     * 循環(huán)構(gòu)建MyLink對象提针。
     * @return
     */
    public void createLink() {
        //拿到長度命爬,知道構(gòu)造的節(jié)點是從哪里開始
        int a = links.length;
        //鏈?zhǔn)浇Y(jié)構(gòu)中除了尾節(jié)點,其他節(jié)點必須包含當(dāng)前對象所指向下一個對象的地址辐脖,
        //那么構(gòu)造時就必須知道后一個節(jié)點的位置饲宛,所以必須從后往前構(gòu)造。先構(gòu)造最后一個結(jié)點嗜价。
        links[a - 1] = new MyLink(a, null);
        //循環(huán)構(gòu)造MyLink對象艇抠,i=a-1相對于長度(個數(shù))來說是倒數(shù)第二,所以其中l(wèi)inks[i-1]就表示倒數(shù)第二位的元素
        //久锥,從后往前構(gòu)造到links[0]家淤,頭節(jié)點需要自己手動構(gòu)造。i相對于長度瑟由,所以links[0]對應(yīng)i就是1絮重,
        //也就是說只能循環(huán)到i=1
        for (int i = a - 1; i >= 1; i--) {
            links[i - 1] = new MyLink(i, links[i]);
        }
        //構(gòu)造頭節(jié)點,指向數(shù)組第一個元素
        myLinkHeader = new MyLink(links[0]);
    }

    /**
     * 查出傳入k位置的數(shù)據(jù)域和下一個節(jié)點的地址
     * @param k
     * @return
     */
    public MyLink getLink(int k) throws Throwable {
        if (k<1 || k>links.length) {
            throw new Throwable("查詢位置不合理");
        }
        //k是查找出k位置的元素歹苦,j是開始計數(shù)的位置青伤;0是因為會多出一個頭節(jié)點,先從頭開始殴瘦,頭不計入查找的數(shù)組潮模。
        int j = 0;
        //用一個MyLink對象來不斷接收被重新賦對象。它先指向頭
        MyLink myLink = myLinkHeader;
        //從頭開始找痴施,直到
        while (j < k) {
            myLink = myLink.getNextLink();
            j++;
        }
        return myLink;
    }
}

SelectLinkListTest.java

public class SelectLinkListTest {
    public static void main(String[] args) {
        //循環(huán)構(gòu)造myLink
        MyLink[] myLinks = new MyLink[10];
        SelectLinkList selectLinkList = new SelectLinkList(myLinks);
        selectLinkList.createLink();
        //獲取k位置的數(shù)據(jù)域中的數(shù)據(jù)
        MyLink link;
        try {
            link = selectLinkList.getLink(6);
            System.out.println("獲取的數(shù)值域中數(shù)據(jù)為:" + link.getData());
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}

結(jié)果

結(jié)果應(yīng)該是:


image.png

如果輸入的getLink()參數(shù)不滿足條件:


image.png

插入

其特點是擎厢,在i位置插入,插入元素的指針指向原來i位置指針指向的元素辣吃,那么將原來i-1位置的元素的指針改為指向插入的元素动遭。
類結(jié)構(gòu):

  • InsertLinkList.java
  • InsertLinkListTest.java
    InsertLinkList構(gòu)造線性表鏈?zhǔn)酱鎯Y(jié)構(gòu),并提供插入和查詢方法神得;InsertLinkListTest測試厘惦。

代碼實現(xiàn)

InsertLinkList

public class InsertLinkList {
    /**
     * 用來幫助循環(huán)構(gòu)建MyLink對象
     */
    private MyLink[] links;
    /**
     * 假定傳入MyLink[10],即要創(chuàng)建10個MyLink對象哩簿。這10個對象中是不應(yīng)該包含頭節(jié)點的宵蕉。
     * 因為傳入的數(shù)組中,所有位置都要包含數(shù)據(jù)节榜;而MyLink的對象中頭節(jié)點的構(gòu)造方法是
     * MyLink(MyLink nextLink)羡玛,所以在這里拿出來。
     */
    private MyLink myLinkHeader = null;

    /**
     * 為了傳入自定義MyLink[]的長度
     * @param links
     */
    public InsertLinkList(MyLink[] links) {
        this.links = links;
    }

    /**
     * 循環(huán)構(gòu)建MyLink對象宗苍。
     * @return
     */
    public void createLink() {
        //拿到長度稼稿,知道構(gòu)造的節(jié)點是從哪里開始
        int a = links.length;
        //鏈?zhǔn)浇Y(jié)構(gòu)中除了尾節(jié)點薄榛,其他節(jié)點必須包含當(dāng)前對象所指向下一個對象的地址,
        //那么構(gòu)造時就必須知道后一個節(jié)點的位置让歼,所以必須從后往前構(gòu)造敞恋。先構(gòu)造最后一個結(jié)點。
        links[a - 1] = new MyLink(a, null);
        //循環(huán)構(gòu)造MyLink對象谋右,i=a-1相對于長度(個數(shù))來說是倒數(shù)第二硬猫,所以其中l(wèi)inks[i-1]就表示倒數(shù)第二位的元素
        //,從后往前構(gòu)造到links[0]改执,頭節(jié)點需要自己手動構(gòu)造啸蜜。i相對于長度,所以links[0]對應(yīng)i就是1天梧,
        //也就是說只能循環(huán)到i=1
        for (int i = a - 1; i >= 1; i--) {
            links[i - 1] = new MyLink(i, links[i]);
        }
        //構(gòu)造頭節(jié)點,指向數(shù)組第一個元素
        myLinkHeader = new MyLink(links[0]);
    }

    /**
     * 在i位置屁股后面插入myLink對象
     * @param myLink
     * @param i
     */
    public void insertLink(MyLink myLink,int i) {
        MyLink myLinkMove = myLinkHeader.getNextLink();
        if (i == 0) {
            //在頭位置插入myLink對象霞丧,讓myLink對象指向頭指針指向的對象呢岗,頭結(jié)點指向myLink對象
            myLink.setNextLink(myLinkMove);
            myLinkHeader.setNextLink(myLink);
        }else if (i>=1 && i<links.length-1){
            //遍歷獲取到插入位置i的myLink對象
            for (int k = 1; k < i ; k++) {
                myLinkMove = myLinkMove.getNextLink();
            }
            //獲取i位置的沒有Link對象的下一對象
            MyLink myLink2 = myLinkMove.getNextLink();
            //插入的對象的指針為原來位置指向下一結(jié)點的指針
            myLink.setNextLink(myLink2);
            //將插入位的對象的指針設(shè)置為要插入的對象
            myLinkMove.setNextLink(myLink);
        }else {
            //插入的位置超出或等于長度時,獲取到末尾結(jié)點蛹尝,讓末尾結(jié)點的指針執(zhí)行myLink對象
            MyLink myLinkLast = links[links.length-1];
            myLinkLast.setNextLink(myLink);
        }

    }


    /**
     * 查出傳入k位置的數(shù)據(jù)域和下一個節(jié)點的地址
     * @param k
     * @return
     */
    public MyLink getLink(int k) throws Throwable {
        if (k<1 || k>links.length+1) {
            throw new Throwable("查詢位置不合理");
        }
        //k是查找出k位置的元素后豫,j是開始計數(shù)的位置;0是因為會多出一個頭節(jié)點突那,先從頭開始挫酿,頭不計入查找的數(shù)組置森。
        int j = 0;
        //用一個MyLink對象來不斷接收被重新賦對象岔冀。它先指向頭
        MyLink myLink = myLinkHeader;
        //從頭開始找,直到
        while (j < k) {
            myLink = myLink.getNextLink();
            j++;
        }
        return myLink;
    }
}

InsertLinkListTest

public class InsertLinkListTest {
    public static void main(String[] args) {
        //循環(huán)構(gòu)造myLink
        MyLink[] myLinks = new MyLink[10];
        InsertLinkList insertLinkList = new InsertLinkList(myLinks);
        insertLinkList.createLink();
        //插入
        MyLink myLink = new MyLink(19,null );
        insertLinkList.insertLink(myLink, 2);
        try {
            MyLink link = insertLinkList.getLink(3);
            System.out.println(link.getData());
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}

結(jié)果

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扛拨,一起剝皮案震驚了整個濱河市猫缭,隨后出現(xiàn)的幾起案子葱弟,更是在濱河造成了極大的恐慌,老刑警劉巖猜丹,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芝加,死亡現(xiàn)場離奇詭異,居然都是意外死亡射窒,警方通過查閱死者的電腦和手機藏杖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脉顿,“玉大人蝌麸,你說我怎么就攤上這事“保” “怎么了祥楣?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵开财,是天一觀的道長。 經(jīng)常有香客問我误褪,道長责鳍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任兽间,我火速辦了婚禮历葛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嘀略。我一直安慰自己恤溶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布帜羊。 她就那樣靜靜地躺著咒程,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讼育。 梳的紋絲不亂的頭發(fā)上帐姻,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機與錄音奶段,去河邊找鬼饥瓷。 笑死,一個胖子當(dāng)著我的面吹牛痹籍,可吹牛的內(nèi)容都是我干的呢铆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼蹲缠,長吁一口氣:“原來是場噩夢啊……” “哼棺克!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起线定,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤逆航,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后渔肩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體因俐,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年周偎,在試婚紗的時候發(fā)現(xiàn)自己被綠了抹剩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡蓉坎,死狀恐怖澳眷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蛉艾,我是刑警寧澤钳踊,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布衷敌,位于F島的核電站,受9級特大地震影響拓瞪,放射性物質(zhì)發(fā)生泄漏缴罗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一祭埂、第九天 我趴在偏房一處隱蔽的房頂上張望面氓。 院中可真熱鬧,春花似錦蛆橡、人聲如沸舌界。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呻拌。三九已至,卻和暖如春睦焕,著一層夾襖步出監(jiān)牢的瞬間藐握,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工复亏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留趾娃,地道東北人缭嫡。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓缔御,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妇蛀。 傳聞我的和親對象是個殘疾皇子耕突,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,492評論 2 348