2022-10-14 算法訓(xùn)練第三天(203.移除鏈表元素 707.設(shè)計鏈表 206.反轉(zhuǎn)鏈表 )

203.移除鏈表元素

解題思路:

  1. 為鏈表新增一個虛擬頭節(jié)點路翻,定義一個當(dāng)前指針指向虛擬頭節(jié)點澳厢。通過while循環(huán)遍歷鏈表驼抹,只有當(dāng)前指針指向最后一個節(jié)點的時候毙驯,循環(huán)停止柱锹。
  2. 每次循環(huán)中哪自,首先判斷當(dāng)前指針指向的節(jié)點的下一個節(jié)點的元素是否為目標(biāo)值,如果為真禁熏,定義一個臨時變量指向即將刪除的下一個節(jié)點提陶,然后將即將刪除的節(jié)點中next信息傳遞給當(dāng)前節(jié)點的next,delete改臨時指針匹层,釋放下一個節(jié)點的空間隙笆。
  3. 如果為否,當(dāng)前指針指向下一個節(jié)點升筏。當(dāng)前指針指向節(jié)點的next為空之后撑柔,說明當(dāng)前指針已經(jīng)指向了最后一個指針,循環(huán)結(jié)束您访。
  4. 最后將虛擬頭節(jié)點中的next賦值給head頭指針铅忿,最后釋放虛擬頭節(jié)點的空間。
        ListNode* dummyHead = new ListNode(0); 
        dummyHead->next = head; 
        ListNode* cur = dummyHead;
        while (cur->next != NULL) {
            if(cur->next->val == val) {
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            } else {
                cur = cur->next;
            }
        }
        head = dummyHead->next;
        delete dummyHead;
        return head;

707.設(shè)計鏈表

解題思路;

  1. 設(shè)計一個鏈表類灵汪,一個完整的鏈表必須要包含頭指針檀训,所以為增添一個私有數(shù)據(jù)成員為指向鏈表頭結(jié)點的指針,指針類型為一個節(jié)點類型享言,所以要在類中明確節(jié)點的結(jié)構(gòu)峻凫,定義了一個結(jié)構(gòu)體,結(jié)構(gòu)體中的構(gòu)造函數(shù)用于初始化結(jié)構(gòu)體览露,不加構(gòu)造函數(shù)就沒辦法在括號中為節(jié)點初始化荧琼,只能借助于->和.來對節(jié)點中的元素進行初始化。私有成員還包含了size變量,用于判斷索引值是否合法命锄。
  2. 鏈表類的構(gòu)造函數(shù)中堰乔,開辟一個節(jié)點空間,同時初始化頭指針脐恩,但該節(jié)點為虛擬頭節(jié)點镐侯。另一方面size初始化為0;
  3. get函數(shù)實現(xiàn)過程驶冒,首先要判斷索引是否合法苟翻。定義臨時指針指向真實頭節(jié)點,這一點很關(guān)鍵只怎。后接while循環(huán)開始移動當(dāng)前指針,指針先移動怜俐,索引在移動身堡,索引會移動index位,指針也移動index位拍鲤,最終當(dāng)前指針指向目標(biāo)節(jié)點贴谎,直接取值。
class MyLinkedList {
public:
    // 定義鏈表節(jié)點結(jié)構(gòu)體
    struct LinkedNode {
        int val;
        LinkedNode* next;
        LinkedNode(int val):val(val), next(nullptr){}
    };

    // 初始化鏈表
    MyLinkedList() {
        _dummyHead = new LinkedNode(0); // 這里定義的頭結(jié)點 是一個虛擬頭結(jié)點季稳,而不是真正的鏈表頭結(jié)點
        _size = 0;
    }

    // 獲取到第index個節(jié)點數(shù)值擅这,如果index是非法數(shù)值直接返回-1, 注意index是從0開始的景鼠,第0個節(jié)點就是頭結(jié)點
    int get(int index) {
        if (index > (_size - 1) || index < 0) {
            return -1;
        }
        LinkedNode* cur = _dummyHead->next;
        while(index--){ // 如果--index 就會陷入死循環(huán)
            cur = cur->next;
        }
        return cur->val;
    }

    // 在鏈表最前面插入一個節(jié)點仲翎,插入完成后,新插入的節(jié)點為鏈表的新的頭結(jié)點
    void addAtHead(int val) {
        LinkedNode* newNode = new LinkedNode(val);
        newNode->next = _dummyHead->next;
        _dummyHead->next = newNode;
        _size++;
    }

    // 在鏈表最后面添加一個節(jié)點
    void addAtTail(int val) {
        LinkedNode* newNode = new LinkedNode(val);
        LinkedNode* cur = _dummyHead;
        while(cur->next != nullptr){
            cur = cur->next;
        }
        cur->next = newNode;
        _size++;
    }

    // 在第index個節(jié)點之前插入一個新節(jié)點铛漓,例如index為0溯香,那么新插入的節(jié)點為鏈表的新頭節(jié)點。
    // 如果index 等于鏈表的長度浓恶,則說明是新插入的節(jié)點為鏈表的尾結(jié)點
    // 如果index大于鏈表的長度玫坛,則返回空
    void addAtIndex(int index, int val) {
        if (index > _size) {
            return;
        }
        LinkedNode* newNode = new LinkedNode(val);
        LinkedNode* cur = _dummyHead;
        while(index--) {
            cur = cur->next;
        }
        newNode->next = cur->next;
        cur->next = newNode;
        _size++;
    }

    // 刪除第index個節(jié)點,如果index 大于等于鏈表的長度包晰,直接return湿镀,注意index是從0開始的
    void deleteAtIndex(int index) {
        if (index >= _size || index < 0) {
            return;
        }
        LinkedNode* cur = _dummyHead;
        while(index--) {
            cur = cur ->next;
        }
        LinkedNode* tmp = cur->next;
        cur->next = cur->next->next;
        delete tmp;
        _size--;
    }

    // 打印鏈表
    void printLinkedList() {
        LinkedNode* cur = _dummyHead;
        while (cur->next != nullptr) {
            cout << cur->next->val << " ";
            cur = cur->next;
        }
        cout << endl;
    }
private:
    int _size;
    LinkedNode* _dummyHead;

};

206.反轉(zhuǎn)鏈表

解題思路:

雙指針法:定義三個指針,一個當(dāng)前指針伐憾,由于沒有虛擬節(jié)點勉痴,它直接指向頭節(jié)點。一個臨時指針用于保存之后節(jié)點的信息树肃。一個pre指針用于指向前一個節(jié)點蚀腿。
首先保存下一個節(jié)點的位置,將當(dāng)前節(jié)點指向前一個節(jié)點,pre節(jié)點指向當(dāng)前節(jié)點莉钙,當(dāng)前指針指向下一個節(jié)點廓脆。

class Solution {
public: 
    ListNode* reverseList(ListNode* head) {
        ListNode* temp; // 保存cur的下一個節(jié)點
        ListNode* cur = head;
        ListNode* pre = NULL;
        while(cur) {
            temp = cur->next;  // 保存一下 cur的下一個節(jié)點,因為接下來要改變cur->next
            cur->next = pre; // 翻轉(zhuǎn)操作
            // 更新pre 和 cur指針
            pre = cur;
            cur = temp;
        }
        return pre;
    }
};

遞歸法

class Solution {
public:
    ListNode* reverse(ListNode* pre,ListNode* cur){
        if(cur == NULL) return pre;
        ListNode* temp = cur->next;
        cur->next = pre;
        // 可以和雙指針法的代碼進行對比磁玉,如下遞歸的寫法停忿,其實就是做了這兩步
        // pre = cur;
        // cur = temp;
        return reverse(cur,temp);
    }
    ListNode* reverseList(ListNode* head) {
        // 和雙指針法初始化是一樣的邏輯
        // ListNode* cur = head;
        // ListNode* pre = NULL;
        return reverse(NULL, head);
    }

};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蚊伞,隨后出現(xiàn)的幾起案子席赂,更是在濱河造成了極大的恐慌,老刑警劉巖时迫,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颅停,死亡現(xiàn)場離奇詭異,居然都是意外死亡掠拳,警方通過查閱死者的電腦和手機癞揉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溺欧,“玉大人喊熟,你說我怎么就攤上這事〗愕螅” “怎么了芥牌?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長聂使。 經(jīng)常有香客問我壁拉,道長,這世上最難降的妖魔是什么柏靶? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任扇商,我火速辦了婚禮,結(jié)果婚禮上宿礁,老公的妹妹穿的比我還像新娘案铺。我一直安慰自己,他們只是感情好梆靖,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布控汉。 她就那樣靜靜地躺著,像睡著了一般返吻。 火紅的嫁衣襯著肌膚如雪姑子。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天测僵,我揣著相機與錄音街佑,去河邊找鬼谢翎。 笑死,一個胖子當(dāng)著我的面吹牛沐旨,可吹牛的內(nèi)容都是我干的森逮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼磁携,長吁一口氣:“原來是場噩夢啊……” “哼褒侧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谊迄,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤闷供,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后统诺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歪脏,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年粮呢,在試婚紗的時候發(fā)現(xiàn)自己被綠了婿失。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡鬼贱,死狀恐怖移怯,靈堂內(nèi)的尸體忽然破棺而出香璃,到底是詐尸還是另有隱情这难,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布葡秒,位于F島的核電站姻乓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏眯牧。R本人自食惡果不足惜蹋岩,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望学少。 院中可真熱鬧剪个,春花似錦、人聲如沸版确。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绒疗。三九已至侵歇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吓蘑,已是汗流浹背惕虑。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溃蔫。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓健提,卻偏偏與公主長得像,于是被迫代替她去往敵國和親酒唉。 傳聞我的和親對象是個殘疾皇子矩桂,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

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