国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

代碼隨想錄 - 鏈表

這篇具有很好參考價(jià)值的文章主要介紹了代碼隨想錄 - 鏈表。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

總結(jié)概述

代碼隨想錄 - 鏈表,鏈表,數(shù)據(jù)結(jié)構(gòu)

鏈表理論基礎(chǔ)

鏈表是一種通過(guò)指針串聯(lián)的線性結(jié)構(gòu),每一個(gè)節(jié)點(diǎn)由兩部分組成,一個(gè)是數(shù)據(jù)域一個(gè)是指針域(存放指向下一個(gè)節(jié)點(diǎn)的指針),最后一個(gè)節(jié)點(diǎn)的指針域指向null(空指針的意思)。

鏈表的類型?

1、單鏈表?

單鏈表中的指針域只能指向節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)。?

代碼隨想錄 - 鏈表,鏈表,數(shù)據(jù)結(jié)構(gòu)

2、雙鏈表

雙鏈表:每一個(gè)節(jié)點(diǎn)有兩個(gè)指針域,一個(gè)指向下一個(gè)節(jié)點(diǎn),一個(gè)指向上一個(gè)節(jié)點(diǎn)。

雙鏈表 既可以向前查詢也可以向后查詢。

代碼隨想錄 - 鏈表,鏈表,數(shù)據(jù)結(jié)構(gòu)

3、循環(huán)鏈表

代碼隨想錄 - 鏈表,鏈表,數(shù)據(jù)結(jié)構(gòu)

鏈表存儲(chǔ)方式

鏈表是通過(guò)指針域的指針鏈接在內(nèi)存中各個(gè)節(jié)點(diǎn)。

????????所以鏈表中的節(jié)點(diǎn)在內(nèi)存中不是連續(xù)分布的 ,而是散亂分布在內(nèi)存中的某地址上,分配機(jī)制取決于操作系統(tǒng)的內(nèi)存管理。

代碼隨想錄 - 鏈表,鏈表,數(shù)據(jù)結(jié)構(gòu)

上圖鏈表起始節(jié)點(diǎn)為2, 終止節(jié)點(diǎn)為7, 各節(jié)點(diǎn)分布在內(nèi)存的不同地址空間上,通過(guò)指針串聯(lián)。

鏈表的定義

// 單鏈表
struct ListNode {
    int val;  // 節(jié)點(diǎn)上存儲(chǔ)的元素
    ListNode *next;  // 指向下一個(gè)節(jié)點(diǎn)的指針
    ListNode(int x) : val(x), next(NULL) {}  // 節(jié)點(diǎn)的構(gòu)造函數(shù)
};

鏈表的操作

1、刪除節(jié)點(diǎn)?

代碼隨想錄 - 鏈表,鏈表,數(shù)據(jù)結(jié)構(gòu)

將C節(jié)點(diǎn)的next指針指向E節(jié)點(diǎn)就可以了。在C++里再手動(dòng)釋放這個(gè)D節(jié)點(diǎn),釋放這塊內(nèi)存。

2、添加節(jié)點(diǎn)?

代碼隨想錄 - 鏈表,鏈表,數(shù)據(jù)結(jié)構(gòu)

可以看出鏈表的增添和刪除都是O(1)操作,也不會(huì)影響到其他節(jié)點(diǎn)。

但是要注意,要是刪除第五個(gè)節(jié)點(diǎn),需要從頭節(jié)點(diǎn)查找到第四個(gè)節(jié)點(diǎn)通過(guò)next指針進(jìn)行刪除操作,查找的時(shí)間復(fù)雜度是O(n)。

性能分析

數(shù)組在定義的時(shí)候,長(zhǎng)度就是固定的,如果想改動(dòng)數(shù)組的長(zhǎng)度,就需要重新定義一個(gè)新的數(shù)組。

鏈表的長(zhǎng)度可以不固定,并且可以動(dòng)態(tài)增刪, 適合數(shù)據(jù)量不固定,頻繁增刪,較少查詢的場(chǎng)景。

代碼隨想錄 - 鏈表,鏈表,數(shù)據(jù)結(jié)構(gòu)

203. 移除鏈表元素

代碼隨想錄 - 鏈表,鏈表,數(shù)據(jù)結(jié)構(gòu)

解題思路及代碼

鏈表操作的兩種方式:

  • 直接使用原來(lái)的鏈表來(lái)進(jìn)行刪除操作。
  • 設(shè)置一個(gè)虛擬頭結(jié)點(diǎn)在進(jìn)行刪除操作。
第一種操作:

直接使用原來(lái)的鏈表來(lái)進(jìn)行移除

代碼隨想錄 - 鏈表,鏈表,數(shù)據(jù)結(jié)構(gòu)

代碼隨想錄 - 鏈表,鏈表,數(shù)據(jù)結(jié)構(gòu)

????????在單鏈表中移除頭結(jié)點(diǎn) 和 移除其他節(jié)點(diǎn)的操作方式是不一樣,其實(shí)在寫(xiě)代碼的時(shí)候也會(huì)發(fā)現(xiàn),需要單獨(dú)寫(xiě)一段邏輯來(lái)處理移除頭結(jié)點(diǎn)的情況。

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 刪除頭結(jié)點(diǎn)
        while (head != NULL && head->val == val) { // 注意這里不是if
            ListNode* tmp = head;
            head = head->next;
            delete tmp;
        }

        // 刪除非頭結(jié)點(diǎn)
        ListNode* cur = head;
        while (cur != NULL && cur->next!= NULL) {
            if (cur->next->val == val) {
                ListNode* tmp = cur->next;
                cur->next = cur->next->next;
                delete tmp;
            } else {
                cur = cur->next;
            }
        }
        return head;
    }
};
第二種操作:

可以設(shè)置一個(gè)虛擬頭結(jié)點(diǎn),以一種統(tǒng)一的邏輯來(lái)移除

代碼隨想錄 - 鏈表,鏈表,數(shù)據(jù)結(jié)構(gòu)

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        ListNode* dummyHead = new ListNode(0); // 設(shè)置一個(gè)虛擬頭結(jié)點(diǎn)
        dummyHead->next = head; // 將虛擬頭結(jié)點(diǎn)指向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;
    }
};
  • 時(shí)間復(fù)雜度: O(n)
  • 空間復(fù)雜度: O(1)

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

代碼隨想錄 - 鏈表,鏈表,數(shù)據(jù)結(jié)構(gòu)

class MyLinkedList {
public:
    MyLinkedList() {
        this->size = 0;
        this->head = new ListNode(0);
    }
    
    int get(int index) {
        if (index < 0 || index >= size) {
            return -1;
        }
        ListNode *cur = head;
        for (int i = 0; i <= index; i++) {
            cur = cur->next;
        }
        return cur->val;
    }
    
    void addAtHead(int val) {
        addAtIndex(0, val);
    }
    
    void addAtTail(int val) {
        addAtIndex(size, val);
    }
    
    void addAtIndex(int index, int val) {
        if (index > size) {
            return;
        }
        index = max(0, index);
        size++;
        ListNode *pred = head;
        for (int i = 0; i < index; i++) {
            pred = pred->next;
        }
        ListNode *toAdd = new ListNode(val);
        toAdd->next = pred->next;
        pred->next = toAdd;
    }
    
    void deleteAtIndex(int index) {
        if (index < 0 || index >= size) {
            return;
        }
        size--;
        ListNode *pred = head;
        for (int i = 0; i < index; i++) {
            pred = pred->next;
        }
        ListNode *p = pred->next;
        pred->next = pred->next->next;
        delete p;
    }
private:
    int size;
    ListNode *head;

};

206. 反轉(zhuǎn)鏈表

代碼隨想錄 - 鏈表,鏈表,數(shù)據(jù)結(jié)構(gòu)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-640736.html

ListNode* reverseList(ListNode* head) {
    ListNode *cur = head; // cur 指向當(dāng)前節(jié)點(diǎn),從頭節(jié)點(diǎn)開(kāi)始
    ListNode *pre = NULL; // pre 指向當(dāng)前節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn),初始為空
    ListNode* temp; // 用于暫存當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)

    while (cur != NULL) { // 遍歷整個(gè)鏈表
        temp = cur->next; // 保存當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),防止斷鏈
        cur->next = pre; // 將當(dāng)前節(jié)點(diǎn)指向前一個(gè)節(jié)點(diǎn),完成翻轉(zhuǎn)操作

        // 更新 pre 和 cur 指針
        pre = cur;
        cur = temp;
    }
    return pre; // 返回翻轉(zhuǎn)后的鏈表頭節(jié)點(diǎn)
}

到了這里,關(guān)于代碼隨想錄 - 鏈表的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 代碼隨想錄 第三天||203.移除鏈表元素

    代碼隨想錄 第三天||203.移除鏈表元素

    鏈表與數(shù)組不同,鏈表是映像存儲(chǔ),不像數(shù)組那樣連續(xù)存址,所以對(duì)于鏈表刪除節(jié)點(diǎn)應(yīng)該按照下面的圖示進(jìn)行: 代碼如下: ? ?

    2024年02月12日
    瀏覽(15)
  • 【代碼隨想錄 | Leetcode | 第七天】鏈表 | 鏈表相交 | 環(huán)形鏈表 II

    【代碼隨想錄 | Leetcode | 第七天】鏈表 | 鏈表相交 | 環(huán)形鏈表 II

    歡迎來(lái)到小K的Leetcode|代碼隨想錄|專題化專欄,今天將為大家?guī)?lái)鏈表相交和環(huán)形鏈表 II的分享 ? ?題目鏈接點(diǎn)這里 給你兩個(gè)單鏈表的頭節(jié)點(diǎn) headA 和 headB ,請(qǐng)你找出并返回兩個(gè)單鏈表相交的起始節(jié)點(diǎn)。如果兩個(gè)鏈表沒(méi)有交點(diǎn),返回 null 。 圖示兩個(gè)鏈表在節(jié)點(diǎn) c1 開(kāi)始相交:

    2024年02月17日
    瀏覽(45)
  • 代碼隨想錄【鏈表】--->刪除倒數(shù)第N個(gè)節(jié)點(diǎn)、鏈表相交、環(huán)形鏈表

    代碼隨想錄【鏈表】--->刪除倒數(shù)第N個(gè)節(jié)點(diǎn)、鏈表相交、環(huán)形鏈表

    ?? 代碼隨想錄 ?? 數(shù)組篇 : 二分查找 移除數(shù)組 有序數(shù)組的平方 長(zhǎng)度最小的數(shù)組 螺旋矩陣 鏈表篇 : 鏈表移除 設(shè)計(jì)鏈表 反轉(zhuǎn)鏈表 交換鏈表中的節(jié)點(diǎn) 題目LeetCode19. 刪除鏈表的倒數(shù)第 N 個(gè)結(jié)點(diǎn) 這道題的邏輯比較清晰 1. 先找到倒數(shù)第n+1個(gè)節(jié)點(diǎn) 2. 刪除倒數(shù)第n個(gè)節(jié)點(diǎn) 為什么要

    2023年04月26日
    瀏覽(14)
  • 【代碼隨想錄 | Leetcode | 第五天】鏈表 | 移除鏈表元素 | 設(shè)計(jì)鏈表 | 203-707

    【代碼隨想錄 | Leetcode | 第五天】鏈表 | 移除鏈表元素 | 設(shè)計(jì)鏈表 | 203-707

    歡迎來(lái)到小K的Leetcode|代碼隨想錄|專題化專欄,今天將為大家?guī)?lái)移除鏈表元素和設(shè)計(jì)鏈表的分享 ? ?題目鏈接點(diǎn)這里 給你一個(gè)鏈表的頭節(jié)點(diǎn) head 和一個(gè)整數(shù) val ,請(qǐng)你刪除鏈表中所有滿足 Node.val == val 的節(jié)點(diǎn),并返回 新的頭節(jié)點(diǎn) 。 示例 1: 示例 2: 示例 3: 提示: 列表中

    2024年02月16日
    瀏覽(40)
  • 代碼隨想錄第四天 兩兩交換鏈表中的節(jié)點(diǎn)

    題目:24. 兩兩交換鏈表中的節(jié)點(diǎn) 給你一個(gè)鏈表,兩兩交換其中相鄰的節(jié)點(diǎn),并返回交換后鏈表的頭節(jié)點(diǎn)。你必須在不修改節(jié)點(diǎn)內(nèi)部的值的情況下完成本題(即,只能進(jìn)行節(jié)點(diǎn)交換)。 樣例: 非遞歸實(shí)現(xiàn) 思路:1.先排除空節(jié)點(diǎn)和單個(gè)節(jié)點(diǎn);2對(duì)于兩個(gè)節(jié)點(diǎn)需要交換他們的順序

    2024年04月16日
    瀏覽(47)
  • 代碼隨想錄Day3 | 鏈表01-leetcode203、707、206

    題目鏈接:移除鏈表元素 思路: 鏈表中元素的添加和刪除關(guān)鍵是要 保證不斷鏈且指向關(guān)系正確 。對(duì)于刪除操作,鏈的修改涉及將待刪除元素的前一個(gè)元素指向待刪除元素的后一個(gè)元素,因此在判斷當(dāng)前元素是否需要?jiǎng)h除時(shí),要記錄當(dāng)前元素的前后指針。 1.刪除頭結(jié)點(diǎn)時(shí)另作

    2024年02月16日
    瀏覽(92)
  • 【代碼隨想錄刷題記錄】 203.移除鏈表元素 、 707.設(shè)計(jì)鏈表 、206.反轉(zhuǎn)鏈表

    題目 給你一個(gè)鏈表的頭節(jié)點(diǎn) head 和一個(gè)整數(shù) val ,請(qǐng)你刪除鏈表中所有滿足 Node.val == val 的節(jié)點(diǎn),并返回 新的頭節(jié)點(diǎn) 。 題目鏈接:https://leetcode.cn/problems/remove-linked-list-elements/ 代碼 小結(jié) 該題主要注意鏈表刪除的操作以及在特殊情況下如何進(jìn)行操作。特殊情況包括頭結(jié)點(diǎn)為目標(biāo)

    2024年02月08日
    瀏覽(20)
  • 代碼隨想錄day3 | 203.移除鏈表元素 707.設(shè)計(jì)鏈表 206.反轉(zhuǎn)鏈表

    代碼隨想錄day3 | 203.移除鏈表元素 707.設(shè)計(jì)鏈表 206.反轉(zhuǎn)鏈表

    直接讓前一個(gè)節(jié)點(diǎn)指向后一個(gè)節(jié)點(diǎn)即可 兩種方法 第一種:直接刪除 第二種:頭刪的時(shí)候,直接 head=head-next 其實(shí)這兩種方法都沒(méi)有做到統(tǒng)一 第三種:虛擬頭結(jié)點(diǎn)法 這樣的話,咱們刪除的時(shí)候,就是以統(tǒng)一的規(guī)則來(lái)進(jìn)行刪除啦! 203.移除鏈表元素 法一:原始刪除法 1、while(h

    2024年02月16日
    瀏覽(23)
  • 代碼隨想錄day3|鏈表理論基礎(chǔ)、移除鏈表元素、設(shè)計(jì)鏈表、翻轉(zhuǎn)鏈表

    代碼隨想錄day3|鏈表理論基礎(chǔ)、移除鏈表元素、設(shè)計(jì)鏈表、翻轉(zhuǎn)鏈表

    1、基本類型:?jiǎn)捂湵怼㈦p鏈表、循環(huán)鏈表 2、存儲(chǔ)方式:和數(shù)組不一樣,鏈表是隨機(jī)存儲(chǔ)在內(nèi)存中,不是連續(xù)分配在內(nèi)存中。 3、鏈表的定義: 定義了一個(gè)數(shù)據(jù)域,還有一個(gè)指針域,并且定義了一個(gè)構(gòu)造函數(shù)。 4、鏈表的操作: 刪除節(jié)點(diǎn): ?在圖中,若需要?jiǎng)h除D這個(gè)節(jié)點(diǎn),只

    2024年02月05日
    瀏覽(29)
  • 代碼隨想錄Day3|鏈表理論基礎(chǔ)|203.移除鏈表元素|707.設(shè)計(jì)鏈表|206.反轉(zhuǎn)鏈表

    雖然以前寫(xiě)過(guò)一次鏈表,但是真的已經(jīng)忘得一干二凈了 鏈表 :通過(guò) 指針 串聯(lián)在一起的線性結(jié)構(gòu),每個(gè) 節(jié)點(diǎn) 都由數(shù)據(jù)域和指針域組成。 指針域 :存放下一個(gè)節(jié)點(diǎn)的指針,最后一個(gè)節(jié)點(diǎn)的指針域指向null,也即空指針 head :鏈表的入口節(jié)點(diǎn),也即鏈表的頭節(jié)點(diǎn) 鏈表的類型 單

    2024年02月11日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包