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

二、鏈表(linked-list)

這篇具有很好參考價值的文章主要介紹了二、鏈表(linked-list)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、定義

鏈表是一種物理存儲單元上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。鏈表由一系列結(jié)點(鏈表中每一個元素稱為結(jié)點)組成,結(jié)點可以在運行時動態(tài)生成。每個結(jié)點包括兩個部分:一個是存儲數(shù)據(jù)元素的數(shù)據(jù)域,另一個是存儲下一個結(jié)點地址的指針域。 相比于線性表順序結(jié)構(gòu),操作復雜。由于不必須按順序存儲,鏈表在插入的時候可以達到O(1)的復雜度,比另一種線性表順序表快得多,但是查找一個節(jié)點或者訪問特定編號的節(jié)點則需要O(n)的時間,而線性表和順序表相應的時間復雜度分別是O(logn)和O(1)。

二、經(jīng)典例題

(一)21.合并兩個有序鏈表

二、鏈表(linked-list),Agorithm,鏈表,數(shù)據(jù)結(jié)構(gòu)

1.思路

根據(jù)題目描述,鏈表l1, l2是遞增的,因此容易想到使用雙指針cur1和cur2遍歷兩鏈表,根據(jù)cur1.val和cur2.val的大小關(guān)系確定節(jié)點添加順序,兩節(jié)點指針交替前進,直至遍歷完畢。
同時因為兩個鏈表都是有序的,所以,當我們遍歷完一個鏈表,剩下的那個鏈表如果沒到結(jié)尾,可以直接跟上。

2.復雜度分析

時間復雜度 O(M+N) : M,N別為兩個鏈表的長度,合并操作需遍歷兩鏈表。
空間復雜度 O(1): 節(jié)點引用 dum , cur使用常數(shù)大小的額外空間。

3.注意

Dummy節(jié)點的作用是作為一個虛擬的頭前節(jié)點。在不知道要返回的新鏈表的頭結(jié)點是哪一個,它可能是原鏈表的第一個節(jié)點,可能在原鏈表的中間,也可能在最后,甚至不存在(nil)。引入Dummy節(jié)點可以涵蓋所有情況,并且可以使用dummy.next返回最終需要的頭結(jié)點。

4.代碼

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
        ListNode* cur1 = list1;
        ListNode* cur2 = list2;
        ListNode* dummy = new ListNode(-1); // 虛擬頭結(jié)點
        ListNode* cur = dummy;
        while (cur1 && cur2) {
        // 比較 p1 和 p2 兩個指針
        // 將值較小的的節(jié)點接到 p 指針
            if (cur1 -> val > cur2 -> val) {
                cur -> next = cur2;
                cur2 = cur2 -> next;
            }
            else {
                cur -> next = cur1;
                cur1 = cur1 -> next;
            }
            cur = cur -> next; // p 指針不斷前進
        }
        if (cur1) cur -> next = cur1;
        if (cur2) cur -> next = cur2;

        return dummy -> next;
    }
};

(二)86.分割鏈表

1.思路

具體來說,我們可以把原鏈表分成兩個小鏈表,一個鏈表中的元素大小都小于 x,另一個鏈表中的元素都大于等于 x,最后再把這兩條鏈表接到一起,就得到了題目想要的結(jié)果。

2.復雜度分析

時間復雜度 O(N): 其中 N為鏈表長度;遍歷鏈表使用線性時間。

空間復雜度 O(1) : 假頭節(jié)點使用常數(shù)大小的額外空間。

3.代碼

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        ListNode* dummy1 = new ListNode(-1);
        ListNode* dummy2 = new ListNode(-1);
        ListNode* small = dummy1;
        ListNode* big = dummy2;
        // 新建兩個鏈表 small,big,分別用于添加所有節(jié)點值<x、節(jié)點值>=的節(jié)點
        ListNode* cur = head;
        while (cur) {
            if (cur -> val >= x) {
                big -> next = cur;
                big = big -> next;
            }
            else {
                small -> next = cur;
                small = small -> next;
            }
            cur = cur -> next;
        }
        small -> next = dummy2 -> next; // 拼接 small 和 big
        big -> next = nullptr;
        return dummy1 -> next;
    }
};

(三)23.合并 K 個升序鏈表

1.思路

如何快速得到 k 個節(jié)點中的最小節(jié)點,接到結(jié)果鏈表上?

  • 這里我們就要用到 優(yōu)先級隊列(二叉堆) 這種數(shù)據(jù)結(jié)構(gòu),把鏈表節(jié)點放入一個最小堆,就可以每次獲得 k 個節(jié)點中的最小節(jié)點:

優(yōu)先隊列 pq 中的元素個數(shù)最多是 k,所以一次 poll 或者 add 方法的時間復雜度是 O(logk);所有的鏈表節(jié)點都會被加入和彈出 pq,所以算法整體的時間復雜度是 O(Nlogk),其中 k 是鏈表的條數(shù),N 是這些鏈表的節(jié)點總數(shù)。

2.復雜度分析

時間復雜度:考慮優(yōu)先隊列中的元素不超過 k 個,那么插入和刪除的時間代價為 O(log?k),這里最多有 kn 個點,對于每個點都被插入刪除各一次,故總的時間代價即漸進時間復雜度為 O(kn×log?k)。
空間復雜度:這里用了優(yōu)先隊列,優(yōu)先隊列中的元素不超過 k個,故漸進空間復雜度為 O(k)。

3.代碼

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
// 時間復雜度 : O(n ? log(k))
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if (lists.size() == 0) return nullptr;

        ListNode* dummy = new ListNode(-1);
        ListNode* p = dummy;

       priority_queue<ListNode*, vector<ListNode*>, function<bool(ListNode*, ListNode*)>> pq(
        [] (ListNode* a, ListNode* b) { return a->val > b->val; });

        for (auto head : lists) {
            if (head != nullptr) pq.push(head);
        }

        while (!pq.empty()) {
            ListNode* node = pq.top();
            pq.pop();
            p -> next = node;
            
            if (node -> next != nullptr)
                pq.push(node->next);

            p = p -> next;
        }
    return dummy -> next;
    }
};

(四)19.刪除鏈表中的倒數(shù)第N個節(jié)點

1.思路

假設(shè)鏈表有 n 個節(jié)點,倒數(shù)第 k 個節(jié)點就是正數(shù)第 n - k + 1 個節(jié)點。
是的,但是算法題一般只給你一個 ListNode 頭結(jié)點代表一條單鏈表,你不能直接得出這條鏈表的長度 n,而需要先遍歷一遍鏈表算出 n 的值,然后再遍歷鏈表計算第 n - k + 1 個節(jié)點。
也就是說,這個解法需要遍歷兩次鏈表才能得到出倒數(shù)第 k 個節(jié)點。文章來源地址http://www.zghlxwxcb.cn/news/detail-733616.html

2.復雜度分析

3.代碼

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
         if (head == nullptr || n == 0) return nullptr;

        ListNode* dummy = new ListNode(-1);
        dummy -> next = head;

        ListNode* x = findFromEnd(dummy, n + 1);
        x -> next = x -> next -> next;
        return dummy -> next;
    }
    ListNode* findFromEnd(ListNode* head, int k) {

    // 代碼見上文

        ListNode* slow = head;
        ListNode* fast = head;

        while (k -- && fast) {
            fast = fast -> next;
        }
        while (fast) {
            slow = slow -> next;
            fast = fast -> next;
        }
        return slow;
    }
};

到了這里,關(guān)于二、鏈表(linked-list)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • 數(shù)據(jù)結(jié)構(gòu)英文習題解析-第二章 鏈表List

    前言:最近快到FDS考試了,po重刷了一下學校的題目,自己整理了一些解析orz 因為po在自己找解析和學習的過程中非常痛苦,所以在此共享一下我的題目和自己寫的解題思路,歡迎各位指出錯誤~全章節(jié)預計會陸續(xù)更新,可在專欄查看~ HW2 1. For a sequentially stored linear list of leng

    2024年04月11日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)】_4.List接口實現(xiàn)類LinkedList與鏈表

    【數(shù)據(jù)結(jié)構(gòu)】_4.List接口實現(xiàn)類LinkedList與鏈表

    目錄 1.鏈表的結(jié)構(gòu)與特點 1.1 鏈表的結(jié)構(gòu): 1.2 鏈表的特點: 2. 不帶頭單鏈表的模擬實現(xiàn) 3. 單鏈表OJ 3.1 題目1:移除鏈表元素:? 3.2 題目2:反轉(zhuǎn)一個單鏈表 3.3 題目3:返回鏈表的中間結(jié)點 3.4 題目4:鏈表的倒數(shù)第k個結(jié)點 3.5 題目5:合并兩個有序鏈表 3.6 題目6:鏈表的回文結(jié)構(gòu)

    2024年02月15日
    瀏覽(18)
  • 數(shù)據(jù)結(jié)構(gòu)之線性表的類型運用Linear Lists: 數(shù)組,棧,隊列,鏈表

    定義 一個最簡單,最基本的數(shù)據(jù)結(jié)構(gòu)。一個線性表由多個相同類型的元素穿在一次,并且每一個元素都一個前驅(qū)(前一個元素)和后繼(后一個元素)。 線性表的類型 常見的類型:數(shù)組、棧、隊列、鏈表 這些不同數(shù)據(jù)結(jié)構(gòu)的特性可以解決不同種類的問題 題面 題目描述 有

    2024年02月12日
    瀏覽(25)
  • 鏈表 Linked List

    鏈表 Linked List

    2024.3.15 芝士wa 參考視頻:bilibli-數(shù)據(jù)結(jié)構(gòu)-鏈表 “印度小哥講得真好” 對于鏈表來說,存儲數(shù)據(jù)需要兩個部分,一是數(shù)據(jù)本身,二是指針,該指針指向下一個數(shù)據(jù)的地址,依次鏈接,直到最后一個元素,指針指向空(NULL) 遍歷的時間復雜度為O(n) 插入的時間復雜度為O(n) 刪除

    2024年03月17日
    瀏覽(36)
  • 雙向鏈表(Double Linked List)

    雙向鏈表(Double Linked List)

    ? ? ? ? 雖然單向鏈表能夠100%解決邏輯關(guān)系為“一對一”數(shù)據(jù)的存儲問題,但在解決那些需要大量查找前趨節(jié)點的問題是,單向鏈表無疑是不能用了,因為單向鏈表適合“從前往后”查找,并不適合“從后往前”查找。 ? ? ? ? 如果要提高鏈表的查找效率,那雙向鏈表(雙

    2023年04月13日
    瀏覽(19)
  • 數(shù)據(jù)結(jié)構(gòu)-鏈表結(jié)構(gòu)-雙向鏈表

    數(shù)據(jù)結(jié)構(gòu)-鏈表結(jié)構(gòu)-雙向鏈表

    雙向鏈表也叫雙鏈表,與單向鏈表不同的是,每一個節(jié)點有三個區(qū)域組成:兩個指針域,一個數(shù)據(jù)域 前一個指針域:存儲前驅(qū)節(jié)點的內(nèi)存地址 后一個指針域:存儲后繼節(jié)點的內(nèi)存地址 數(shù)據(jù)域:存儲節(jié)點數(shù)據(jù) 以下就是雙向鏈表的最基本單位 節(jié)點的前指針域指向前驅(qū),后指針

    2024年02月04日
    瀏覽(31)
  • <數(shù)據(jù)結(jié)構(gòu)> 鏈表 - 鏈表的概念及結(jié)構(gòu)

    <數(shù)據(jù)結(jié)構(gòu)> 鏈表 - 鏈表的概念及結(jié)構(gòu)

    概念: 鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的 邏輯順序 是通過鏈表中的 指針鏈接 次序?qū)崿F(xiàn)的 1、鏈表由一系列結(jié)點(鏈表中每一個元素稱為結(jié)點)組成。 2、結(jié)點可以在運行時動態(tài)(malloc)生成。 3、每個結(jié)點包括兩個部分:一個是存儲數(shù)據(jù)元素的

    2023年04月09日
    瀏覽(52)
  • 【數(shù)據(jù)結(jié)構(gòu)-鏈表-01】反轉(zhuǎn)鏈表

    【數(shù)據(jù)結(jié)構(gòu)-鏈表-01】反轉(zhuǎn)鏈表

    ??????歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kuan 的首頁,持續(xù)學習,不斷總結(jié),共同進步,活到老學到老 導航 檀越劍指大廠系列:全面總

    2024年02月10日
    瀏覽(27)
  • LeetCode 92. Reverse Linked List II【鏈表,頭插法】中等

    LeetCode 92. Reverse Linked List II【鏈表,頭插法】中等

    本文屬于「征服LeetCode」系列文章之一,這一系列正式開始于2021/08/12。由于LeetCode上部分題目有鎖,本系列將至少持續(xù)到刷完所有無鎖題之日為止;由于LeetCode還在不斷地創(chuàng)建新題,本系列的終止日期可能是永遠。在這一系列刷題文章中,我不僅會講解多種解題思路及其優(yōu)化,

    2024年02月09日
    瀏覽(19)
  • 數(shù)據(jù)結(jié)構(gòu)——線性數(shù)據(jù)結(jié)構(gòu)(數(shù)組,鏈表,棧,隊列)

    數(shù)據(jù)結(jié)構(gòu)——線性數(shù)據(jù)結(jié)構(gòu)(數(shù)組,鏈表,棧,隊列)

    數(shù)組(Array) 是一種很常見的數(shù)據(jù)結(jié)構(gòu)。它由相同類型的元素(element)組成,并且是使用一塊連續(xù)的內(nèi)存來存儲。 我們直接可以利用元素的索引(index)可以計算出該元素對應的存儲地址。 數(shù)組的特點是: 提供隨機訪問 并且容量有限。 2.1. 鏈表簡介 鏈表(LinkedList) 雖然是

    2024年02月11日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包