707.設(shè)計(jì)鏈表

707.設(shè)計(jì)鏈表

解題思路

  • get(index):獲取鏈表中第 index 個(gè)節(jié)點(diǎn)的值诞帐。如果索引無(wú)效蟋滴,則返回-1。
  • addAtHead(val):在鏈表的第一個(gè)元素之前添加一個(gè)值為 val 的節(jié)點(diǎn)陨囊。插入后肛著,新節(jié)點(diǎn)將成為鏈表的第一個(gè)節(jié)點(diǎn)煌恢。
  • addAtTail(val):將值為 val 的節(jié)點(diǎn)追加到鏈表的最后一個(gè)元素归形。
  • addAtIndex(index,val):在鏈表中的第 index 個(gè)節(jié)點(diǎn)之前添加值為 val 的節(jié)點(diǎn)。如果 index 等于鏈表的長(zhǎng)度葵孤,則該節(jié)點(diǎn)將附加到鏈表的末尾担钮。如果 index 大于鏈表長(zhǎng)度,則不會(huì)插入節(jié)點(diǎn)尤仍。如果index小于0箫津,則在頭部插入節(jié)點(diǎn)。
  • deleteAtIndex(index):如果索引 index 有效宰啦,則刪除鏈表中的第 index 個(gè)節(jié)點(diǎn)鲤嫡。

出現(xiàn)的問(wèn)題

其實(shí)上課都學(xué)過(guò),用圖來(lái)說(shuō)都記得都會(huì)绑莺。但是不知道代碼語(yǔ)言該如何去操作。

JavaScript解法代碼

class LinkNode{
    constructor(value,next){
    this.val = value
    this.next = next
    }
}

var MyLinkedList = function() {
    this._size = 0
    //認(rèn)為是頭結(jié)點(diǎn)
    this._head = null
    this._tail = null
};

/** 
 * @param {number} index
 * @return {number}
 */
 MyLinkedList.prototype.getNode = function(index) {
     // 判斷index的合法性
    if(index < 0 || index >= this._size) return null;
    // 創(chuàng)建虛擬頭節(jié)點(diǎn)
    let current = new LinkNode(0,this._head)
    // while 遍歷之后的節(jié)點(diǎn)
    while(index >= 0){
        current = current.next
        index--
    }
    return current
};
MyLinkedList.prototype.get = function(index) {
    // 判斷index的合法性
    if(index < 0 || index >= this._size) return -1    
    return this.getNode(index).val
};

/** 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtHead = function(val) {
    // 初始化這個(gè)新節(jié)點(diǎn)惕耕,并且首先將new node的next指向head節(jié)點(diǎn)
    const newNode =  new LinkNode(val,this._head)
    // 然后將虛擬頭節(jié)點(diǎn)指向這個(gè)新節(jié)點(diǎn)纺裁。代碼這么寫(xiě)↓
    this._head = newNode
    this._size++

    if(!this._tail) {
        this._tail = newNode;
    }

};

/** 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtTail = function(val) {
    // 初始化新節(jié)點(diǎn),并將新節(jié)點(diǎn)的next指向null
    const newNode = new LinkNode(val, null)
    this._size++
    if(this._tail){
        this._tail.next = newNode
        this._tail = newNode
        return 
    }
    // 應(yīng)該是什么特殊邊界情況
    this._tail = newNode;
    this._head = newNode;
};

/** 
 * @param {number} index 
 * @param {number} val
 * @return {void}
 */
MyLinkedList.prototype.addAtIndex = function(index, val) {
    // 判斷index的合法性
    // if(index < 0 || index >= this._size) return null    
    if(index > this._size) return;
    if(index <= 0) {
        this.addAtHead(val);
        return;
    }
    if(index === this._size) {
        this.addAtTail(val);
        return;
    }

    // 獲取插入第index節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn)
    const previousNode = this.getNode(index - 1);
    // 該插入節(jié)點(diǎn)指向原本的下一個(gè)階段,然后上一個(gè)節(jié)點(diǎn)指向該插入節(jié)點(diǎn)
    previousNode.next = new LinkNode(val, previousNode.next);
    this._size++;
};

/** 
 * @param {number} index
 * @return {void}
 */
MyLinkedList.prototype.deleteAtIndex = function(index) {
    if(index < 0 || index >= this._size) return;
    if(index === 0) {
        this._head = this._head.next;
        // 如果刪除的這個(gè)節(jié)點(diǎn)同時(shí)是尾節(jié)點(diǎn)欺缘,要處理尾節(jié)點(diǎn)
        if(index === this._size - 1){
            this._tail = this._head
        }
        this._size--;
        return;
    }


    // 獲取要?jiǎng)h除節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn)
    const previousNode = this.getNode(index - 1);
    // 直接指向下一個(gè)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)
    previousNode.next = previousNode.next.next
     // 處理尾節(jié)點(diǎn)
    if(index === this._size - 1) {
        this._tail = node;
    }

    this._size--

};

/**
 * Your MyLinkedList object will be instantiated and called as such:
 * var obj = new MyLinkedList()
 * var param_1 = obj.get(index)
 * obj.addAtHead(val)
 * obj.addAtTail(val)
 * obj.addAtIndex(index,val)
 * obj.deleteAtIndex(index)
 */

總結(jié):

增加節(jié)點(diǎn)栋豫,重點(diǎn)是先將新節(jié)點(diǎn)的next指向下一個(gè)節(jié)點(diǎn),再將前一個(gè)節(jié)點(diǎn)的next指向這個(gè)節(jié)點(diǎn)谚殊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丧鸯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嫩絮,更是在濱河造成了極大的恐慌丛肢,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剿干,死亡現(xiàn)場(chǎng)離奇詭異蜂怎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)置尔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)杠步,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人榜轿,你說(shuō)我怎么就攤上這事幽歼。” “怎么了谬盐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵甸私,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我设褐,道長(zhǎng)颠蕴,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任助析,我火速辦了婚禮犀被,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘外冀。我一直安慰自己寡键,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布雪隧。 她就那樣靜靜地躺著西轩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脑沿。 梳的紋絲不亂的頭發(fā)上藕畔,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音庄拇,去河邊找鬼注服。 笑死韭邓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的溶弟。 我是一名探鬼主播女淑,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辜御!你這毒婦竟也來(lái)了鸭你?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤擒权,失蹤者是張志新(化名)和其女友劉穎袱巨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體菜拓,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓣窄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纳鼎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俺夕。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖贱鄙,靈堂內(nèi)的尸體忽然破棺而出劝贸,到底是詐尸還是另有隱情,我是刑警寧澤逗宁,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布映九,位于F島的核電站,受9級(jí)特大地震影響瞎颗,放射性物質(zhì)發(fā)生泄漏件甥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一哼拔、第九天 我趴在偏房一處隱蔽的房頂上張望引有。 院中可真熱鬧,春花似錦倦逐、人聲如沸譬正。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)曾我。三九已至,卻和暖如春健民,著一層夾襖步出監(jiān)牢的瞬間抒巢,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工秉犹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虐秦,地道東北人平酿。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像悦陋,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子筑辨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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