用js實(shí)現(xiàn)一個(gè)單向鏈表

整個(gè)單向鏈表引用類(lèi)型的程序如下:

//節(jié)點(diǎn)應(yīng)用類(lèi)型
function Node(data){
    this.data=data;
    this.next=null;
}

//鏈表引用類(lèi)型
function List(){
    //哨兵節(jié)點(diǎn)
    this.head=new Node();
    this.size=0;
}

List.prototype={
    //在鏈表尾部添加節(jié)點(diǎn)
    add: function(data){
        var current=this.head;
        while(current.next!=null){
            current=current.next;
        }
        current.next=new Node(data);

        this.size++;
    },

    //遍歷鏈表空免,不對(duì)鏈表元素操作都可以調(diào)用此方法
    forEach: function(callback){
        for(var current=this.head.next;current!=null;current=current.next){
            callback(current.data);
        }
    },

    //打印鏈表中所有元素
    print: function(){
        this.forEach(function(item){
            console.log(item);
        })
    },

    //查找鏈表元素的位置
    indexOf: function(data){
        var pos=0;
        var current=this.head.next;
        while(current!=null){
            if(current.data===data){
                break;
            }
            current=current.next;
            pos++;
        }
        return pos;
    },

   /**
     * 在位置pos處插入節(jié)點(diǎn)值為data
     * 若成功則返回插入的值吧碾,若失敗則返回null
     */
    insert: function(pos,data){
        if(pos<0 || pos>this.size-1){
            return null;
        }

        //插入位置的上一個(gè)節(jié)點(diǎn)
        var last=this.head;
        for(var i=0;i<pos;i++){
            last=last.next;
        }
        //保存下一個(gè)節(jié)點(diǎn)的引用
        var ready=last.next;
        last.next=new Node(data);
        last.next.next=ready;

        this.size++;
        return data;
    },

    /**
     * 刪除指定位置的元素
     * 若成功則返回刪除的值,若失敗則返回null
     */
    removeAt: function(index){
        if(index<0 || index>this.size-1){
            return null;
        }

        var current=this.head.next;
        var last=this.head;
        for(var i=0;i<index;i++){
            last=current;
            current=current.next;
        }
        last.next=current.next;

        this.size--;
        return current.data;
    },

    //刪除相應(yīng)元素
    remove: function(data){
        var current=this.head.next;
        var last=this.head;
        while(current!=null){
            if(current.data===data){
                last.next=current.next;
                //已刪除節(jié)點(diǎn)
                this.size--;
                break;
            }
            last=current;
            current=current.next;
        }
    }
};

實(shí)現(xiàn)單向鏈表要注意的地方是,js沒(méi)有指針禾嫉,因此可以在最開(kāi)始創(chuàng)建一個(gè)哨兵節(jié)點(diǎn),它的next引用指向第一個(gè)節(jié)點(diǎn)蚊丐,這樣可以避免反復(fù)討論是否為第一個(gè)節(jié)點(diǎn)的情況熙参,但是這樣寫(xiě)就要主要每次循環(huán)的起點(diǎn)應(yīng)該是this.head.next
測(cè)試代碼如下:

var list=new List();
list.add(1);
list.add(2);
list.add(3);
list.insert(1,2);
console.log(list.indexOf(2));   //2
list.remove(3);
list.removeAt(1);
console.log(list.size);   //2
list.print();   //1 2
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市麦备,隨后出現(xiàn)的幾起案子孽椰,更是在濱河造成了極大的恐慌昭娩,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黍匾,死亡現(xiàn)場(chǎng)離奇詭異栏渺,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)锐涯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)磕诊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人纹腌,你說(shuō)我怎么就攤上這事霎终。” “怎么了升薯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵莱褒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我涎劈,道長(zhǎng)广凸,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任蛛枚,我火速辦了婚禮谅海,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坤候。我一直安慰自己胁赢,他們只是感情好企蹭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布白筹。 她就那樣靜靜地躺著,像睡著了一般谅摄。 火紅的嫁衣襯著肌膚如雪徒河。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天送漠,我揣著相機(jī)與錄音顽照,去河邊找鬼。 笑死闽寡,一個(gè)胖子當(dāng)著我的面吹牛代兵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播爷狈,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼植影,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了涎永?” 一聲冷哼從身側(cè)響起思币,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鹿响,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后谷饿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體惶我,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年博投,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绸贡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贬堵,死狀恐怖恃轩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情黎做,我是刑警寧澤叉跛,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蒸殿,受9級(jí)特大地震影響筷厘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宏所,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一酥艳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧爬骤,春花似錦充石、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至坷剧,卻和暖如春惰爬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惫企。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工撕瞧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狞尔。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓丛版,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親偏序。 傳聞我的和親對(duì)象是個(gè)殘疾皇子页畦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • //leetcode中還有花樣鏈表題,這里幾個(gè)例子禽车,冰山一角 求單鏈表中結(jié)點(diǎn)的個(gè)數(shù)----時(shí)間復(fù)雜度O(n)這是最...
    暗黑破壞球嘿哈閱讀 1,520評(píng)論 0 6
  • 鏈表(Linked-list) 前面我們討論了如何使用棧寇漫、隊(duì)列進(jìn)行存數(shù)數(shù)據(jù)刊殉,他們其實(shí)都是列表的一種缎谷,底層存儲(chǔ)的數(shù)據(jù)...
    Cryptic閱讀 38,813評(píng)論 7 57
  • 第一章 Nginx簡(jiǎn)介 Nginx是什么 沒(méi)有聽(tīng)過(guò)Nginx己儒?那么一定聽(tīng)過(guò)它的“同行”Apache吧!Ngi...
    JokerW閱讀 32,688評(píng)論 24 1,002
  • 作為一個(gè)資深的新手程序員??,鏈表這些既基礎(chǔ)又深?yuàn)W的東西是日常工作中并不常見(jiàn),但是卻非常重要,所以就總結(jié)一下鏈表的簡(jiǎn)...
    Clark_new閱讀 4,251評(píng)論 4 12
  • 本文內(nèi)容:1瘦穆、 什么是鏈表栓撞?2遍膜、 鏈表共分幾類(lèi)?3瓤湘、 鏈表的 C 實(shí)現(xiàn)瓢颅! 總表:《數(shù)據(jù)結(jié)構(gòu)?》 工程代碼 Gith...
    半紙淵閱讀 39,971評(píng)論 0 54