數(shù)據(jù)結(jié)構(gòu)(二)鏈表實現(xiàn)LinkedList

數(shù)據(jù)結(jié)構(gòu)(一)數(shù)組實現(xiàn)一個簡單的ArrayList
數(shù)據(jù)結(jié)構(gòu)(二)鏈表實現(xiàn)LinkedList
數(shù)據(jù)結(jié)構(gòu)(三)用兩種方式簡單實現(xiàn)棧
數(shù)據(jù)結(jié)構(gòu)(四)棧和隊列的簡單應用
數(shù)據(jù)結(jié)構(gòu)(五)用兩種方式簡單實現(xiàn)隊列
數(shù)據(jù)結(jié)構(gòu)(六)BST二分搜索樹(上)
數(shù)據(jù)結(jié)構(gòu)(六)BST二分搜索樹(下)
數(shù)據(jù)結(jié)構(gòu)(七)兩種方式實現(xiàn)set
數(shù)據(jù)結(jié)構(gòu)(八)兩種方式實現(xiàn)map
數(shù)據(jù)結(jié)構(gòu)(九)set解決LeetCode349號問題

最近學習了鏈表垃帅,自己簡單實現(xiàn)了一個LinkedList,這里只是單鏈表剪勿,不過自己處理了一個虛擬頭節(jié)點贸诚,這樣遍歷的時候就比較省力。這里也是簡單的實現(xiàn)了幾個方法厕吉,add酱固,remove ,get头朱,set运悲,isempty,getsize项钮。
廢話不多下邊是源碼班眯。

package com.company;

public class DummyLinkedList<E> {

    private class Node {
        private E e;
        private Node next;

        public Node(E e, Node next) {
            this.e = e;
            this.next = next;
        }

        public Node(E e) {
            this(e, null);
        }

        public Node() {
            this(null, null);
        }

        @Override
        public String toString() {
            return e.toString();
        }
    }

    private Node dummyHead;
    private int size;

    public DummyLinkedList() {
        dummyHead = new Node(null, null);
        size = 0;
    }

    //返回鏈表中的元素個數(shù)
    public int getSize() {
        return size;
    }

    public boolean isEmpty() {
        return size == 0;
    }


    //在鏈表index的位置添加新的元素e
//    在鏈表中不是一個常用操作,練習用:)
    public void add(int index, E e) {
        if (index < 0 || index > size) {
            throw new IllegalArgumentException("Add failed,Illegal index.");
        }

        Node prev = dummyHead;
        for (int i = 0; i < index; i++) {
            prev = prev.next;
        }

        prev.next = new Node(e, prev.next);
        size++;

    }

 

    //在鏈表頭添加一個元素
    public void addFirst(E e) {
        add(0, e);
    }

    //    在鏈表的末尾添加一個元素
    public void addLast(E e) {
        add(size, e);
    }

    /**
     * 在鏈表中經(jīng)常使用虛擬頭結(jié)點寄纵。
     */


    public E get(int index) {
        if (index < 0 || index >= size)
            throw new IllegalArgumentException("Add failed,Illegal index.");
        Node cur = dummyHead.next;
        for (int i = 0; i < index; i++) {
            cur = cur.next;
        }
        return cur.e;
    }

    public E getFirst() {
        return get(0);
    }

    public E getLast() {
        return get(size - 1);
    }
    //從鏈表中刪除index位置的元素鳖敷,返回刪除的元素
//    從鏈表不是一個常用的操作,練習用
    public E remove(int index) {
        if (index < 0 || index >= size)
            throw new IllegalArgumentException("Remove failed,Illegal index.");

        Node prev = dummyHead;
        for (int i = 0; i < index; i++) {
            prev = prev.next;
        }

        Node delNode = prev.next;
        prev.next = delNode.next;
        delNode.next = null;

        size--;
        return delNode.e;
    }

    public void set(int index, E e) {
        if (index < 0 || index >= size)
            throw new IllegalArgumentException("Add failed,Illegal index.");
        Node cur = dummyHead.next;
        for (int i = 0; i < index; i++) {
            cur = cur.next;
        }
        cur.e = e;
    }

    public boolean contain(E e) {
        Node cur = dummyHead.next;
        while (cur != null) {
            if (cur.e.equals(e)) {
                return true;
            } else {
                cur = cur.next;
            }
        }
        return false;
    }

    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        Node cur = dummyHead.next;
        while (cur != null) {
            res.append(cur.e + "=>");
            cur = cur.next;
        }

        res.append("NULL");
        return res.toString();
    }

 
}

下邊我們來簡單看一下源碼程拭,簡單的方法我們就不介紹了定踱,主要是看add,remove恃鞋。像set其實就是遍歷一下鏈表崖媚,把對應的值設(shè)置給對應的key。get也是一樣恤浪,遍歷一下鏈表畅哑,獲取到對應key的value。contain也是遍歷水由,如果查到對應的key就返回true荠呐,如果差不多就返回false。

  • add方法
    add方法就是在鏈表的末尾添加一個元素,這里也很簡單泥张,遍歷到最后一個然后創(chuàng)建一個新的節(jié)點呵恢。
  • remove方法
    remove方法就是移動到要刪除的節(jié)點那,然后刪除節(jié)點的前一個節(jié)點只想刪除節(jié)點的下一個節(jié)點媚创,然后把刪除節(jié)點指向空渗钉。然后size減一。這樣刪除操作就完成了钞钙。

其實鏈表的操作思想很簡單鳄橘,主要是代碼實現(xiàn)比較費勁。如果要學習鏈表的話可以自己多做練習芒炼,下次我會給兩個鏈表的題瘫怜,并且解釋一下鏈表的實現(xiàn)。


公眾號
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末焕议,一起剝皮案震驚了整個濱河市宝磨,隨后出現(xiàn)的幾起案子弧关,更是在濱河造成了極大的恐慌盅安,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件世囊,死亡現(xiàn)場離奇詭異别瞭,居然都是意外死亡,警方通過查閱死者的電腦和手機株憾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門蝙寨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嗤瞎,你說我怎么就攤上這事墙歪。” “怎么了贝奇?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵虹菲,是天一觀的道長。 經(jīng)常有香客問我掉瞳,道長毕源,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任陕习,我火速辦了婚禮霎褐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘该镣。我一直安慰自己冻璃,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著省艳,像睡著了一般歌粥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拍埠,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天失驶,我揣著相機與錄音,去河邊找鬼枣购。 笑死嬉探,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的棉圈。 我是一名探鬼主播涩堤,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼分瘾!你這毒婦竟也來了胎围?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤德召,失蹤者是張志新(化名)和其女友劉穎白魂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體上岗,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡福荸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了肴掷。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敬锐。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖呆瞻,靈堂內(nèi)的尸體忽然破棺而出台夺,到底是詐尸還是另有隱情,我是刑警寧澤痴脾,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布颤介,位于F島的核電站,受9級特大地震影響明郭,放射性物質(zhì)發(fā)生泄漏买窟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一薯定、第九天 我趴在偏房一處隱蔽的房頂上張望始绍。 院中可真熱鬧,春花似錦话侄、人聲如沸亏推。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吞杭。三九已至盏浇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間芽狗,已是汗流浹背绢掰。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留童擎,地道東北人滴劲。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像顾复,于是被迫代替她去往敵國和親班挖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348