最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實題講解快速掌握單鏈表下

 更新時間:2022年04月11日 12:31:34   作者:三分苦  
單鏈表是后面要學的雙鏈表以及循環(huán)鏈表的基礎(chǔ),要想繼續(xù)深入了解數(shù)據(jù)結(jié)構(gòu)以及C語言,我們就要奠定好這塊基石!接下來就和我一起學習吧

1、移除鏈表元素

鏈接直達:

移除鏈表元素

題目:

 思路:

此題要綜合考慮多種情況,常規(guī)情況就如同示例1,有多個節(jié)點,并且val不連續(xù),但是非常規(guī)呢?當val連續(xù)呢?當頭部就是val呢?所以要分類討論

常規(guī)情況:

需要定義兩個指針prev和cur,cur指向第一個數(shù)據(jù),prev指向cur的前一個。依次遍歷cur指向的數(shù)據(jù)是否為val,若是,則把prev的下一個節(jié)點指向cur的下一個節(jié)點上,cur=cur->next,prev跟著cur一起走,直到cur走到NULL

連續(xù)val:

當我們仔細觀察下,不難發(fā)現(xiàn),在常規(guī)情況下是可以解決連續(xù)val的,但是頭部val就不可了

頭部val:

此時除了剛才定義的兩個指針prev和cur外,還要有個head指向頭部,當頭部是val時,將cur指向下一個位置,head跟著一起動,直到cur指向的數(shù)據(jù)不為val時,將head賦給prev。此時剩余的就按常規(guī)處理即可。

代碼如下:

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

2、反轉(zhuǎn)鏈表

鏈接直達:

反轉(zhuǎn)鏈表

題目:

思路:

法一:三指針翻轉(zhuǎn)方向

定義三個指針n1,n2,n3分別用來指向NULL,第一個數(shù)據(jù),第二個數(shù)據(jù)。讓n2的next指向n1,把n2賦給n1,再把n3賦給n2,再執(zhí)行n3=n3->next的操作,接下來重復上述操作,直到n2指向空即可。但是要注意,要先判斷該鏈表是否為NULL,如果是,則返回NULL,此外,還要保證當n3為空時就不要動了,直接把n3賦給n2即可。

代碼如下:

struct ListNode* reverseList(struct ListNode* head){
    if(head==NULL)
    {
        return NULL;
    }
    struct ListNode*n1=NULL;
    struct ListNode*n2=head;
    struct ListNode*n3=n2->next;
    while(n2)
    {
        n2->next=n1;
        n1=n2;
        n2=n3;
        if(n3)
        {
            n3=n3->next;
        }
    }
    return n1;
}

法二:頭插

此法就需要再創(chuàng)建一個鏈表了,創(chuàng)建一個新的頭部newhead指向NULL,再定義一個指針cur指向原鏈表第一個數(shù)據(jù),注意還得定義一個指針next指向cur的下一個節(jié)點。遍歷原鏈表,把節(jié)點取下來頭插到newhead所在的鏈表。每次更新newhead賦給cur,如圖所示:

 代碼如下:

struct ListNode* reverseList(struct ListNode* head){
    if(head==NULL)
    {
        return NULL;
    }
    struct ListNode*cur=head;
    struct ListNode*next=cur->next;
    struct ListNode*newhead=NULL;
    while(cur)
    {
        cur->next=newhead;
        newhead=cur;
        cur=next;
        if(next)
        {
            next=next->next;
        }
    }
    return newhead;
}

3、鏈表的中間節(jié)點

鏈接直達:

鏈表的中間節(jié)點

題目:

 思路:

快慢指針

這道題要注意奇偶數(shù),如果為奇數(shù),如示例1,那么中間節(jié)點值就是3,反之偶數(shù)如示例2,返回第二個中間節(jié)點。此題我們定義兩個指針slow和fast都指向第一個數(shù)據(jù)的位置,區(qū)別在于讓slow一次走1步,fast一次走2步。當fast走到尾指針時,slow就是中間節(jié)點

 代碼如下:

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

4、鏈表中倒數(shù)第k個節(jié)點

鏈接直達:

鏈表中倒數(shù)第k個節(jié)點

題目:

 思路:

快慢指針

定義兩個指針slow和fast,讓fast先走k步,再讓slow和fast同時走,當fast走到尾部時,slow就是倒數(shù)第k個,因為這樣的話slow和fast的差距始終是k個,當fast走到空時結(jié)束。此題同樣可以走k-1步,不過當fast走到尾部時結(jié)束,也就是fast的下一個節(jié)點指向空時結(jié)束,都一樣。先拿走k步舉例,如圖所示:

 代碼如下:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    // write code here
    struct ListNode*fast=pListHead;
    struct ListNode*slow=pListHead;
    while(k--)
    {
        //if判斷,防止k大于鏈表的長度
        if(fast==NULL)
            return NULL;
        fast=fast->next;
    }
    while(fast)
    {
        fast=fast->next;
        slow=slow->next;
    }
    return slow;
}

5、合并兩個有序鏈表

鏈接直達:

合并兩個有序鏈表

題目:

 思路:

法一:歸并(取小的尾插)--- 帶頭節(jié)點

假設新鏈表的頭叫head并指向NULL,還需要定義一個指針tail來方便后續(xù)的找尾,依次比較list1和list2節(jié)點的值,把小的放到新鏈表head上,并更新tail,再把list1或list2更新一下。當list1和list2兩個鏈表中一個走到空時,直接把剩下的鏈表所有剩下的元素拷進去即可

 代碼如下:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){
    //檢查list1或list2一開始就為NULL的情況
    if(list1==NULL)
    {
        return list2;
    }
    if(list2==NULL)
    {
        return list1;
    }
    struct ListNode*head=NULL;
    struct ListNode*tail=head;
    while(list1&&list2)
    {
        if(list1->val<list2->val)
        {
            if(tail==NULL)
            {
                head=tail=list1;
            }
            else
            {
                tail->next=list1;
                tail=list1;
            }
            list1=list1->next;
        }
        else
        {
            if(tail==NULL)
            {
                head=tail=list2;
            }
            else
            {
                tail->next=list2;
                tail=list2;
            }
            list2=list2->next;
        }
    }
    //當list1和list2其中一個走到空的情況
    if(list1==NULL)
    {
        tail->next=list2;
    }
    else
    {
        tail->next=list1;
    }
    return head;
}

法二:哨兵位的頭節(jié)點

解釋下帶頭節(jié)點:

比如說同樣一個鏈表存1,2,3。不帶頭節(jié)點只有這三個節(jié)點,head指向1。而帶頭節(jié)點的同樣存3個值,不過有4個節(jié)點,head指向頭部這個節(jié)點,這個節(jié)點不存儲有效數(shù)據(jù)

 帶頭結(jié)點有如下好處,不用判斷head和tail是否為空了,也不用判斷l(xiāng)ist1和list2是否為空了,會方便不少。和上述思路一樣,取小的下來尾插,直接鏈接到tail后面即可。但是要注意返回的時候要返回head的next,因為題目給的鏈表是不帶頭的,而head本身指向的就是那個頭,所以要返回下一個。

代碼如下:

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    struct ListNode* head = NULL, * tail = NULL;
    head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));
    head->next = NULL;
    while (list1 && list2)
    {
        if (list1->val < list2->val)
        {
            tail->next = list1;
            tail = list1;
            list1 = list1->next;
        }
        else
        {
            tail->next = list2;
            tail = list2;
            list2 = list2->next;
        }
    }
    //當list1和list2其中一個走到空的情況
    if (list1 == NULL)
    {
        tail->next = list2;
    }
    else
    {
        tail->next = list1;
    }
    struct ListNode* list = head->next;
    free(head);
    head = NULL
        return list;
}

6、鏈表分割

鏈接直達:

鏈表分割

題目:

 思路:

定義兩個鏈表lesshead和greaterhead。遍歷原鏈表,把 < x 的插入到鏈表1,把 > x 的插入到鏈表2,最后再把鏈表1和鏈表2鏈接起來。在定義兩個尾指針以跟進鏈表1和2新增元素

 代碼如下:

class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        struct ListNode* lessHead, * lessTail, * greaterHead, * greaterTail;
        lessHead = lessTail = (struct ListNode*)malloc(sizeof(struct ListNode));
        greaterHead = greaterTail = (struct ListNode*)malloc(sizeof(struct ListNode));
        lessTail->next = greaterTail->next = NULL;
        struct ListNode* cur = pHead;
        while (cur)
        {
            if (cur->val < x)
            {
                lessTail->next = cur;
                lessTail = lessTail->next;
            }
            else
            {
                greaterTail->next = cur;
                greaterTail = greaterTail->next;
            }
            cur = cur->next;
        }
        //合并
        lessTail->next = greaterHead->next;
        greaterTail->next = NULL;
        struct ListNode* list = lessHead->next;
        free(lessHead);
        free(greaterHead);
        return list;
    }
};

到此這篇關(guān)于C語言實題講解快速掌握單鏈表下的文章就介紹到這了,更多相關(guān)C語言 單鏈表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解C語言之緩沖區(qū)溢出

    詳解C語言之緩沖區(qū)溢出

    緩沖區(qū)是一塊連續(xù)的計算機內(nèi)存區(qū)域,可保存相同數(shù)據(jù)類型的多個實例。緩沖區(qū)可以是堆棧、堆和靜態(tài)數(shù)據(jù)區(qū)。在C/C++語言中,通常使用字符數(shù)組和malloc/new實現(xiàn)緩沖區(qū)。溢出指數(shù)據(jù)被添加到分配給該緩沖區(qū)的內(nèi)存塊之外。緩沖區(qū)溢出是最常見的程序缺陷
    2021-06-06
  • 關(guān)于C/C++中的side effect(負效應)和sequence point(序列點)

    關(guān)于C/C++中的side effect(負效應)和sequence point(序列點)

    不知你在寫code時是否遇到這樣的問題?int i = 3; int x = (++i) + (++i) + (++i); 問x值為多少?進行各種理論分析,并在編譯器上實踐,然而可能發(fā)現(xiàn)最終的結(jié)果是不正確的,也是不穩(wěn)定的,不同的編譯器可能會產(chǎn)生不同的結(jié)果。這讓人很頭疼
    2013-10-10
  • c語言strftime時間格式化示例

    c語言strftime時間格式化示例

    C/C++程序中需要程序顯示當前時間,可以使用標準函數(shù)strftime,本文提供一個示例供大家參考
    2014-02-02
  • C語言中指針常量和常量指針的區(qū)別

    C語言中指針常量和常量指針的區(qū)別

    本文主要介紹了C語言中指針常量和常量指針的區(qū)別,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • 詳細分析C++ 數(shù)據(jù)封裝和數(shù)據(jù)抽象

    詳細分析C++ 數(shù)據(jù)封裝和數(shù)據(jù)抽象

    這篇文章主要介紹了C++ 數(shù)據(jù)封裝和數(shù)據(jù)抽象的的相關(guān)資料,文中代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-06-06
  • C/C++仿華容道小游戲

    C/C++仿華容道小游戲

    這篇文章主要介紹了C/C++仿華容道小游戲的相關(guān)資料,模仿實現(xiàn)華容道游戲,感興趣的朋友可以參考一下
    2016-02-02
  • C語言俄羅斯方塊游戲課程設計

    C語言俄羅斯方塊游戲課程設計

    這篇文章主要為大家詳細介紹了C語言俄羅斯方塊游戲課程設計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C++中的取余函數(shù)remainder與fmod詳解

    C++中的取余函數(shù)remainder與fmod詳解

    這篇文章主要為大家詳細介紹了C++中的取余函數(shù)remainder、fmod的具體使用以及自編的remainder及fmod,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習學習
    2023-05-05
  • C++?OpenCV實現(xiàn)二維碼檢測功能

    C++?OpenCV實現(xiàn)二維碼檢測功能

    這篇文章主要介紹了如何利用C++?OpenCV實現(xiàn)二維碼檢測功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-01-01
  • C++中的函數(shù)匯總

    C++中的函數(shù)匯總

    這篇文章主要介紹了 C++中的函數(shù)匯總的相關(guān)資料,需要的朋友可以參考下
    2017-08-08

最新評論

湖口县| 宕昌县| 汝南县| 湘西| 达尔| 出国| 博客| 华蓥市| 赤水市| 平遥县| 奈曼旗| 宕昌县| 凉山| 梁河县| 重庆市| 南华县| 遂平县| 五台县| 东乡族自治县| 上思县| 镇雄县| 南昌市| 察雅县| 化隆| 孝感市| 洛浦县| 揭东县| 山阳县| 闸北区| 阿荣旗| 竹北市| 阿图什市| 买车| 土默特右旗| 宁明县| 霍城县| 屏边| 弋阳县| 浙江省| 沧州市| 门头沟区|