2020-02-15 刷題 3(鏈表)

237 刪除鏈表中的節(jié)點(diǎn)

剛開(kāi)始讀題有點(diǎn)迷惑,怎么就只給了一個(gè)node,又不是單鏈表挪丢,無(wú)法獲取node的前驅(qū),刪除了node鏈表不就斷了么卢厂。后來(lái)想到辦法乾蓬,先把node的后繼的值復(fù)制到node中,然后node指向后繼的后繼慎恒,最后把node原來(lái)的后繼刪掉任内。還是挺巧妙的題目。
代碼:

time: 97.68%, memory: 5.39%
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    void deleteNode(ListNode* node) {
        ListNode *n = node -> next;
        node -> val = n -> val;
        node -> next = n -> next;
        delete n;
    }
};

19 刪除鏈表的倒數(shù)第n個(gè)節(jié)點(diǎn)

標(biāo)簽:雙指針融柬,鏈表
第一種解法是兩次掃描的做法死嗦,為的是熟悉一下鏈表的操作。

leetcode的鏈表中粒氧,head指的就是第一個(gè)元素越除,不是哨兵節(jié)點(diǎn),最后也沒(méi)有尾哨兵節(jié)點(diǎn)外盯,所以必要的時(shí)候摘盆,可以手動(dòng)添加哨兵節(jié)點(diǎn)來(lái)方便操作,當(dāng)然輸出的時(shí)候別忘了刪掉饱苟。

這里添加一個(gè)頭哨兵節(jié)點(diǎn)孩擂,是為了處理第一個(gè)節(jié)點(diǎn)被刪的情況。

time: 100%, memory: 16.65%
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        int cnt = 0;
        ListNode* pre = new ListNode(0), *cur = head; 
        pre -> next = head;  // 設(shè)置哨兵
        for(; cur != NULL; cur = cur -> next){
            cnt++;
        }
        int idx = cnt - n;
        cur = pre;
        while(idx--){
            cur = cur -> next;
        }
        ListNode* tmp = cur -> next;
        cur -> next = tmp -> next;
        delete tmp;
        return pre -> next;
    }
};

第二種做法是只掃描一遍的箱熬,設(shè)置兩個(gè)指針肋殴,保持兩個(gè)指針的距離始終為n囤锉,當(dāng)右邊的指針到達(dá)末尾時(shí)坦弟,左邊的指針就到了要?jiǎng)h除節(jié)點(diǎn)的前驅(qū)护锤。
代碼:

time: 92.35%, memory: 36.57%
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *pre = new ListNode(0);
        pre -> next = head;
        ListNode *p = pre, *q = pre;
        while(n--){
            q = q -> next;
        }
        while(q -> next){
            p = p -> next;
            q = q -> next;
        }
        p -> next = (p -> next) -> next;
        return pre -> next;
    }
};

206 反轉(zhuǎn)鏈表

按照題目要求,我采用了遞歸和迭代兩種做法酿傍,遞歸內(nèi)存占用要大一些烙懦,時(shí)間都差不多。

迭代做法赤炒,從左到右氯析,把相鄰的兩個(gè)節(jié)點(diǎn)交換位置,其中一個(gè)是原來(lái)的head:

time: 98.36%, memory: 68.64%
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if(!head) return head;
        ListNode * pre = new ListNode(0);
        pre -> next = head;
        while(head -> next){
            ListNode * tmp = pre -> next;
            pre -> next = head -> next;
            head -> next = (head -> next) -> next;
            (pre -> next) -> next = tmp;
        }
        return pre -> next;
    }
};

遞歸做法莺褒,從右到左掩缓,把相鄰的兩個(gè)節(jié)點(diǎn)交換位置,其中一個(gè)節(jié)點(diǎn)是最后一個(gè)節(jié)點(diǎn):

time: 98.36%, memory: 5.07%
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    vector<ListNode*> reverse_part(ListNode* head){
        vector<ListNode*> L;
        if(!(head -> next)){
            L.push_back(head);
            L.push_back(head);
            return L;
        }
        L = reverse_part(head -> next);
        L[1] -> next = head;
        head -> next = NULL;
        L[1] = head;
        return L;
    }
    ListNode* reverseList(ListNode* head) {
        if(!head) return head;
        vector<ListNode*> L = reverse_part(head);
        return L[0];
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末遵岩,一起剝皮案震驚了整個(gè)濱河市你辣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尘执,老刑警劉巖舍哄,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異誊锭,居然都是意外死亡表悬,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)丧靡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蟆沫,“玉大人,你說(shuō)我怎么就攤上這事温治》古樱” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵罐盔,是天一觀的道長(zhǎng)但绕。 經(jīng)常有香客問(wèn)我,道長(zhǎng)惶看,這世上最難降的妖魔是什么捏顺? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮纬黎,結(jié)果婚禮上幅骄,老公的妹妹穿的比我還像新娘。我一直安慰自己本今,他們只是感情好拆座,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布主巍。 她就那樣靜靜地躺著,像睡著了一般挪凑。 火紅的嫁衣襯著肌膚如雪孕索。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天躏碳,我揣著相機(jī)與錄音搞旭,去河邊找鬼。 笑死菇绵,一個(gè)胖子當(dāng)著我的面吹牛肄渗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咬最,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼翎嫡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了永乌?” 一聲冷哼從身側(cè)響起惑申,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铆遭,沒(méi)想到半個(gè)月后硝桩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枚荣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年碗脊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橄妆。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡衙伶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出害碾,到底是詐尸還是另有隱情矢劲,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布慌随,位于F島的核電站芬沉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏阁猜。R本人自食惡果不足惜丸逸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剃袍。 院中可真熱鬧黄刚,春花似錦、人聲如沸民效。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至业扒,卻和暖如春检吆,著一層夾襖步出監(jiān)牢的瞬間凶赁,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留交煞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓集嵌,卻偏偏與公主長(zhǎng)得像根欧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凤粗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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

  • 基本概念 鏈表的含義: 鏈表是一種用于存儲(chǔ)數(shù)據(jù)集合的數(shù)據(jù)結(jié)構(gòu)嫌拣,具有以下屬性 相鄰元素之間通過(guò)指針相連 最后一個(gè)元素...
    古劍誅仙閱讀 1,006評(píng)論 0 3
  • ReentrantLock 介紹 一個(gè)可重入的互斥鎖异逐,它具有與使用{synchronized}方法和語(yǔ)句訪問(wèn)的隱式...
    tomas家的小撥浪鼓閱讀 4,056評(píng)論 1 4
  • (上)如何實(shí)現(xiàn)LRU緩存淘汰算法? 一灰瞻、什么是鏈表辅甥? 1.和數(shù)組一樣,鏈表也是一種線性表肆氓。2.從內(nèi)存結(jié)構(gòu)來(lái)看,鏈表...
    碼語(yǔ)生活閱讀 318評(píng)論 0 0
  • 一蕉陋、什么是鏈表? 和數(shù)組一樣凳鬓,鏈表也是一種線性表。 從內(nèi)存結(jié)構(gòu)來(lái)看垦梆,鏈表的內(nèi)存結(jié)構(gòu)是不連續(xù)的內(nèi)存空間仅孩,是將一組零散...
    蹩腳的小三閱讀 1,034評(píng)論 0 0
  • 鏈表(下):如何輕松寫(xiě)出正確的鏈表代碼? 上一節(jié)我講了鏈表相關(guān)的基礎(chǔ)知識(shí)溅蛉。學(xué)完之后公浪,我看到有人留言說(shuō),基礎(chǔ)知識(shí)我都...
    GhostintheCode閱讀 1,303評(píng)論 2 3