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

數(shù)據(jù)結(jié)構(gòu)——鏈表OJ題

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)——鏈表OJ題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

?文章來源地址http://www.zghlxwxcb.cn/news/detail-833445.html

1.給你一個(gè)鏈表的頭節(jié)點(diǎn)?head?和一個(gè)整數(shù)?val?,請(qǐng)你刪除鏈表中所有滿足?Node.val == val?的節(jié)點(diǎn),并返回?新的頭節(jié)點(diǎn)?。

2.給定一個(gè)帶有頭結(jié)點(diǎn) head 的非空單鏈表,返回鏈表的中間結(jié)點(diǎn)。如果有兩個(gè)中間結(jié)點(diǎn),則返回第二個(gè)中間結(jié)點(diǎn)。

3.變形題:找到鏈表中倒數(shù)第k個(gè)節(jié)點(diǎn)

4.經(jīng)典題:將兩個(gè)有序鏈表合并為一個(gè)新的有序鏈表并返回。新鏈表是通過拼接給定的兩個(gè)鏈表的所有節(jié)點(diǎn)組成的。

結(jié)語(yǔ)


個(gè)人主頁(yè):大耳朵土土垚-CSDN博客

所屬專欄:數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)筆記

?

數(shù)據(jù)結(jié)構(gòu)——鏈表OJ題,數(shù)據(jù)結(jié)構(gòu),每日一函數(shù),數(shù)據(jù)結(jié)構(gòu),鏈表

1.給你一個(gè)鏈表的頭節(jié)點(diǎn)?head?和一個(gè)整數(shù)?val?,請(qǐng)你刪除鏈表中所有滿足?Node.val == val?的節(jié)點(diǎn),并返回?新的頭節(jié)點(diǎn)?。

示例 1:

?

數(shù)據(jù)結(jié)構(gòu)——鏈表OJ題,數(shù)據(jù)結(jié)構(gòu),每日一函數(shù),數(shù)據(jù)結(jié)構(gòu),鏈表

輸入:head = [1,2,6,3,4,5,6], val = 6
輸出:[1,2,3,4,5]

解題思路:

創(chuàng)建指針遍歷鏈表找到對(duì)應(yīng)節(jié)點(diǎn)刪除;

創(chuàng)建兩個(gè)指針變量cur和pre用來記錄,cur表示當(dāng)前遍歷的節(jié)點(diǎn),pre表示上一個(gè)節(jié)點(diǎn)如圖所示

數(shù)據(jù)結(jié)構(gòu)——鏈表OJ題,數(shù)據(jù)結(jié)構(gòu),每日一函數(shù),數(shù)據(jù)結(jié)構(gòu),鏈表

不要忘了有兩種情況,當(dāng)?shù)谝粋€(gè)節(jié)點(diǎn)就是對(duì)應(yīng)節(jié)點(diǎn)時(shí)需要將頭指針head改變?;

如果忘記第一種情況就會(huì)發(fā)現(xiàn)以下示例:

數(shù)據(jù)結(jié)構(gòu)——鏈表OJ題,數(shù)據(jù)結(jié)構(gòu),每日一函數(shù),數(shù)據(jù)結(jié)構(gòu),鏈表

圖中null就是指pre為空指針的情況;

以下是完整代碼實(shí)現(xiàn):?

struct ListNode {
    int val;
    struct ListNode* next;
};
struct ListNode* removeElements(struct ListNode* head, int val) {
    struct ListNode* cur = head;
    struct ListNode* pre = NULL;
    while (cur)
    {
        if (cur->val == val)//找到val值相同的節(jié)點(diǎn)時(shí)
        {
            if (pre == NULL)//如果是第一個(gè)節(jié)點(diǎn),也就是圖中第②種
            {
                cur = head->next;
                free(head);
                head = cur;
            }
            else//其他情況
            {
                pre->next = cur->next;
                free(cur);
                cur = pre->next;
            }
        }
        else//不相同時(shí)
        {
            pre = cur;
            cur = cur->next;
        }
    }
    return head;
}

另外一種思路:

遍歷鏈表,把不是val節(jié)點(diǎn)拿出來尾插,這里就不細(xì)講有興趣的可以打在評(píng)論區(qū)或私信我哦~

代碼如下:

struct ListNode {
    int val;
    struct ListNode* next;
    
};
struct ListNode* removeElements(struct ListNode* head, int val) {
    struct ListNode* cur = head;
    struct ListNode* newhead = NULL;
    struct ListNode* tail = NULL;
    while (cur)
    {
        if (cur->val != val)
        {
            if (newhead == NULL)
            {
                tail = cur;
                newhead = cur;
            }
            else
            {
                tail->next = cur;
                tail = tail->next;
            }
            cur = cur->next;
            tail->next = NULL;

        }
        else
        {
            struct ListNode* pos = cur;
            cur = cur->next;
            free(pos);
        }
    }

    return newhead;
}

?

2.給定一個(gè)帶有頭結(jié)點(diǎn) head 的非空單鏈表,返回鏈表的中間結(jié)點(diǎn)。如果有兩個(gè)中間結(jié)點(diǎn),則返回第二個(gè)中間結(jié)點(diǎn)。

數(shù)據(jù)結(jié)構(gòu)——鏈表OJ題,數(shù)據(jù)結(jié)構(gòu),每日一函數(shù),數(shù)據(jù)結(jié)構(gòu),鏈表

解題思路:

給fast,slow兩個(gè)指針,fast走兩步,slow走一步?,當(dāng)fast走到尾時(shí),slow恰好走到中間。

struct ListNode* middleNode(struct ListNode* head) {
    struct ListNode* fast = head, *slow = head;
    while(fast!=NULL&&fast->next != NULL)
    {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}

?

3.變形題:找到鏈表中倒數(shù)第k個(gè)節(jié)點(diǎn)

解題思路:

還是快慢指針,只要fast與slow之間距離為k,那么當(dāng)fast走到終點(diǎn)時(shí),slow所在的節(jié)點(diǎn)就是倒數(shù)第k個(gè)節(jié)點(diǎn)

數(shù)據(jù)結(jié)構(gòu)——鏈表OJ題,數(shù)據(jù)結(jié)構(gòu),每日一函數(shù),數(shù)據(jù)結(jié)構(gòu),鏈表

?

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    // write code here
struct ListNode* fast = pListHead,*slow = pListHead;
 for(int i = 0; i < k; i++)//先讓fast走k步
    {
        if(fast == NULL)//如果k大于鏈表長(zhǎng)度記得要及時(shí)返回哦
         return NULL;
        fast = fast->next;
    
    }
while(fast)
{
   
    fast = fast->next;
    slow = slow->next;
}
return slow;
}

先讓fast走k步拉開距離,然后fast與slow一起走,當(dāng)fast為空指針時(shí),slow即為倒數(shù)第k個(gè)節(jié)點(diǎn);

?

?

4.經(jīng)典題:將兩個(gè)有序鏈表合并為一個(gè)新的有序鏈表并返回。新鏈表是通過拼接給定的兩個(gè)鏈表的所有節(jié)點(diǎn)組成的。

數(shù)據(jù)結(jié)構(gòu)——鏈表OJ題,數(shù)據(jù)結(jié)構(gòu),每日一函數(shù),數(shù)據(jù)結(jié)構(gòu),鏈表

解題思路:

? ? 取小的尾插

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {

    struct ListNode* head = NULL,*tail = NULL;
     if(list1 == NULL)//注意有鏈表為空的情況,直接返回另一個(gè)鏈表
        return list2;
    if(list2 == NULL)
        return list1;
    while(list1 && list2)//注意這里是一個(gè)鏈表結(jié)束就都結(jié)束,所以兩個(gè)都要為真用&&
    {
     if(list1->val <= list2->val)
     {
         if(head == NULL)
         {
             head = tail = list1;
         }
         else
         {
             tail->next = list1;
             tail = tail->next;
         }
         list1= list1->next;
     }
     else
     {  if(head == NULL)
         {
             head = tail = list2;
         }
         else
         {
             tail->next = list2;
             tail = tail->next;
         }
         list2= list2->next;
     }
    }
    if(list1 == NULL)
    {
        tail->next = list2;
    }
    else
    {
        tail->next = list1;
    }
    return head;
}

?要注意當(dāng)有鏈表為空的情況,以及取小結(jié)束后的情況;

?

結(jié)語(yǔ)

鏈表尾插,我們可以用一個(gè)tail指針來記錄尾插后的節(jié)點(diǎn),尾插直接在tail節(jié)點(diǎn)后即可,這樣就不用每次尾插都循環(huán)遍歷,大大減少了時(shí)間復(fù)雜度?,提高了運(yùn)行效率。大家如果有什么問題或者想法歡迎打在評(píng)論區(qū)或私信我哦~

?

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

本文來自互聯(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)文章

  • 數(shù)據(jù)結(jié)構(gòu):力扣OJ題(每日一練)

    數(shù)據(jù)結(jié)構(gòu):力扣OJ題(每日一練)

    示例: ? ? ? ? 初始化: 初始化隊(duì)列Q1,Q2; 入棧: 先將要入棧的數(shù)據(jù)放入為空的隊(duì)列中,都為空時(shí),放入Q1; 出棧: 當(dāng)要出棧時(shí),將Q1的數(shù)據(jù)出列n-1個(gè),此時(shí)的Q1就是棧要出棧的數(shù)據(jù)(每次出棧都進(jìn)行一次第三步將為不為空的隊(duì)列數(shù)據(jù)放n-1個(gè)到為空隊(duì)列中)); 獲取棧頂元

    2024年02月12日
    瀏覽(20)
  • 數(shù)據(jù)結(jié)構(gòu):力扣OJ題(每日一練)

    數(shù)據(jù)結(jié)構(gòu):力扣OJ題(每日一練)

    目錄 題一:環(huán)形鏈表 思路一: 題二:復(fù)制帶隨機(jī)指針的鏈表 ?思路一: 本人實(shí)力有限可能對(duì)一些地方解釋的不夠清晰,可以自己嘗試讀代碼,望海涵! 給定一個(gè)鏈表的頭節(jié)點(diǎn) ? head ?,返回鏈表開始入環(huán)的第一個(gè)節(jié)點(diǎn)。? 如果鏈表無環(huán),則返回? null 。 如果鏈表中有某個(gè)節(jié)

    2024年02月12日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)】反轉(zhuǎn)鏈表、鏈表的中間節(jié)點(diǎn)、鏈表的回文結(jié)構(gòu)(單鏈表OJ題)

    【數(shù)據(jù)結(jié)構(gòu)】反轉(zhuǎn)鏈表、鏈表的中間節(jié)點(diǎn)、鏈表的回文結(jié)構(gòu)(單鏈表OJ題)

    正如標(biāo)題所說,本文會(huì)圖文詳細(xì)解析三道單鏈表OJ題,分別為: ?反轉(zhuǎn)鏈表 (簡(jiǎn)單) ?鏈表的中間節(jié)點(diǎn) (簡(jiǎn)單) ?鏈表的回文結(jié)構(gòu) (較難) 把他們放在一起講的原因是: ?反轉(zhuǎn)鏈表 和 ?鏈表的中間節(jié)點(diǎn) 是 ?鏈表的回文結(jié)構(gòu) 的基礎(chǔ) 為什么這樣說?請(qǐng)往下看: 目錄 1. 反轉(zhuǎn)鏈

    2024年02月13日
    瀏覽(104)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】手撕鏈表OJ題

    【數(shù)據(jù)結(jié)構(gòu)與算法】手撕鏈表OJ題

    給你一個(gè)鏈表的頭節(jié)點(diǎn) head 和一個(gè)整數(shù) val ,請(qǐng)你刪除鏈表中所有滿足 Node.val == val 的節(jié)點(diǎn),并返回 新的頭節(jié)點(diǎn) 思路一 :一種比較普遍的方式,邊遍歷邊找不同。我們可以通過定義兩個(gè)指針,一個(gè)指向頭節(jié)點(diǎn),一個(gè)置為NULL。當(dāng)遇到值為相同的時(shí)候,直接跳過去。指向下一位

    2024年02月10日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)OJ題】環(huán)形鏈表II

    【數(shù)據(jù)結(jié)構(gòu)OJ題】環(huán)形鏈表II

    原題鏈接:https://leetcode.cn/problems/linked-list-cycle-ii/description/ 如果有小伙伴不了解環(huán)形鏈表,可以先看看這篇文章: https://blog.csdn.net/m0_62531913/article/details/132352203?spm=1001.2014.3001.5502 我們來看下圖: ?我們根據(jù)這個(gè)結(jié)論就可以做出這道題目了!

    2024年02月12日
    瀏覽(19)
  • 【數(shù)據(jù)結(jié)構(gòu)OJ題】移除鏈表元素

    【數(shù)據(jù)結(jié)構(gòu)OJ題】移除鏈表元素

    原題鏈接:力扣? 給你一個(gè)鏈表的頭節(jié)點(diǎn)? head ?和一個(gè)整數(shù)? val ?,請(qǐng)你刪除鏈表中所有滿足? Node.val == val ?的節(jié)點(diǎn),并返回 新的頭節(jié)點(diǎn) ?。 ?方法一:原地刪除節(jié)點(diǎn) 思路: ?首先,定義兩個(gè)指針:prve和cur。它們會(huì)在遍歷鏈表的過程中分別指向當(dāng)前節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)和當(dāng)前

    2024年02月11日
    瀏覽(22)
  • 【數(shù)據(jù)結(jié)構(gòu)】--oj_合并兩個(gè)有序鏈表(詳解)

    【數(shù)據(jù)結(jié)構(gòu)】--oj_合并兩個(gè)有序鏈表(詳解)

    目錄 方法一:無頭結(jié)點(diǎn)的方法? 方法二:有頭結(jié)點(diǎn)的方法 題述: 已給函數(shù)頭: struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) 已給出鏈表的結(jié)構(gòu)體定義: struct ListNode { ?? ?struct ListNode* next; ?? ?int val; }; 已知l1、l2分別指向兩個(gè)鏈表 要求: 將兩個(gè)升序鏈表合并為一

    2024年02月07日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)與算法】:10道鏈表經(jīng)典OJ

    【數(shù)據(jù)結(jié)構(gòu)與算法】:10道鏈表經(jīng)典OJ

    思路1:遍歷原鏈表,將 val 所在的節(jié)點(diǎn)釋放掉。(太麻煩) 思路2:創(chuàng)建新鏈表,再遍歷原鏈表,找到不為 val 的節(jié)點(diǎn)尾插到新鏈表。 思路1代碼實(shí)現(xiàn)如下: 注意: 1.當(dāng)鏈表為空時(shí),直接返回NULL即可。 2.當(dāng)尾插上最后一個(gè)有效節(jié)點(diǎn)時(shí),此時(shí)它的 next 可能還與最后一個(gè)節(jié)點(diǎn)相鏈接,

    2024年04月14日
    瀏覽(29)
  • (c語(yǔ)言實(shí)現(xiàn))數(shù)據(jù)結(jié)構(gòu)鏈表oj題(2)

    (c語(yǔ)言實(shí)現(xiàn))數(shù)據(jù)結(jié)構(gòu)鏈表oj題(2)

    ??個(gè)人主頁(yè):?? :???初階牛??? ??推薦專欄: ??????C語(yǔ)言進(jìn)階 ??個(gè)人信條: ??知行合一 ??本篇簡(jiǎn)介::分析力扣中有關(guān)鏈表的部分題目. 題目來源于:??途W(wǎng)-題目鏈接 輸入一個(gè)鏈表,輸出該鏈表中倒數(shù)第k個(gè)結(jié)點(diǎn)。 示例: 輸入:1,{1,2,3,4,5} 返回值:{5} 創(chuàng)建兩個(gè)指針: ①

    2024年02月04日
    瀏覽(29)
  • 【Java--數(shù)據(jù)結(jié)構(gòu)】鏈表經(jīng)典OJ題詳解(上)

    【Java--數(shù)據(jù)結(jié)構(gòu)】鏈表經(jīng)典OJ題詳解(上)

    歡迎關(guān)注個(gè)人主頁(yè):逸狼 創(chuàng)造不易,可以點(diǎn)點(diǎn)贊嗎~ 如有錯(cuò)誤,歡迎指出~ 目錄 談?wù)勵(lì)^插、頭刪、尾插、頭插的時(shí)間復(fù)雜度 反轉(zhuǎn)一個(gè)單鏈表? 鏈表的中間結(jié)點(diǎn) 返回倒數(shù)第k個(gè)結(jié)點(diǎn) 合并兩個(gè)鏈表 頭插和頭刪的時(shí)間復(fù)雜度為O(1), 尾插和尾刪的時(shí)間復(fù)雜度為O(n) (因?yàn)槲膊搴?/p>

    2024年04月27日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包