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

【leetcode】鏈表的中間節(jié)點|鏈表中倒數(shù)第k個節(jié)點

這篇具有很好參考價值的文章主要介紹了【leetcode】鏈表的中間節(jié)點|鏈表中倒數(shù)第k個節(jié)點。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

1.鏈表的中間節(jié)點

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


1.鏈表的中間節(jié)點

【leetcode】鏈表的中間節(jié)點|鏈表中倒數(shù)第k個節(jié)點,數(shù)據(jù)結構,leetcode,鏈表,算法

思路1:遍歷鏈表,統(tǒng)計節(jié)點個數(shù)count,返回第count/2 +1個節(jié)點?

??Note:注意循環(huán)條件為--mid,--mid循環(huán)執(zhí)行mid-1次,mid--循環(huán)mid次,返回的是中間節(jié)點的下一個節(jié)點

struct ListNode* middleNode(struct ListNode* head){
    struct ListNode* cur = head;
    int count = 0;
    //統(tǒng)計節(jié)點個數(shù)
    while(cur)
    {
        count++;
        cur = cur->next;
    }
    //返回第count/2+1個節(jié)點
    cur = head;
    int mid = count/2 + 1;
    while(--mid)
    {
        cur = cur->next;
    }

    return cur;

}

思路二:快慢指針

設置一個慢指針slow,一個快指針fast,慢指針一次走一步,快指針一次走兩步

需要分兩種情況:鏈表節(jié)點個數(shù)為奇數(shù)個和節(jié)點個數(shù)為偶數(shù)個

1??奇數(shù)個的情況

【leetcode】鏈表的中間節(jié)點|鏈表中倒數(shù)第k個節(jié)點,數(shù)據(jù)結構,leetcode,鏈表,算法

當鏈表節(jié)點個數(shù)為奇數(shù)個時,可以發(fā)現(xiàn),快指針fast->next == NULL時,遍歷結束,此時慢指針slow剛好指向中間節(jié)點

2??偶數(shù)個的情況:

【leetcode】鏈表的中間節(jié)點|鏈表中倒數(shù)第k個節(jié)點,數(shù)據(jù)結構,leetcode,鏈表,算法當鏈表節(jié)點個數(shù)為偶數(shù)個時,可以發(fā)現(xiàn),快指針fast?== NULL時,遍歷結束,此時慢指針slow剛好指向中間節(jié)點

?綜上:遍歷結束的條件為fast == NULL或fast->next == NULL

參考代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-610808.html

struct ListNode* middleNode(struct ListNode* head){
    struct ListNode* fast = head;
    struct ListNode* slow = head;

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

    return slow;

}

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

與上題思路二相似的還有下例?

【leetcode】鏈表的中間節(jié)點|鏈表中倒數(shù)第k個節(jié)點,數(shù)據(jù)結構,leetcode,鏈表,算法

分析:

輸出鏈表中倒數(shù)第k個節(jié)點,假設有一個指針指向鏈表尾節(jié)點的next,即指向NULL,我們從這個節(jié)點向前看,尾節(jié)點相對這個指針來說是第一個節(jié)點,相對鏈表頭指針head來說便是倒數(shù)第一個節(jié)點,對于倒數(shù)第k個節(jié)點,指向這個節(jié)點的指針和指向NULL的指針始終相差的是k個節(jié)點;設置一個快指針fast,一個慢指針slow,fast指針先走k步,slow指針不動,此時fast指針和slow指針就相差k個節(jié)點,然后slow指針和fast指針同時向后走,直到fast指針指向NULL,此時slow指向的節(jié)點就是倒數(shù)第k個節(jié)點

以輸出倒數(shù)第三個節(jié)點為例,步驟如下圖:

【leetcode】鏈表的中間節(jié)點|鏈表中倒數(shù)第k個節(jié)點,數(shù)據(jù)結構,leetcode,鏈表,算法??特殊情況討論:

1??空鏈表:返回空指針

2??倒數(shù)第一個

【leetcode】鏈表的中間節(jié)點|鏈表中倒數(shù)第k個節(jié)點,數(shù)據(jù)結構,leetcode,鏈表,算法

由上圖可以發(fā)現(xiàn),輸出倒數(shù)第一個節(jié)點的邏輯與輸出倒數(shù)的k個節(jié)點的邏輯相同?

3??倒數(shù)第N個(鏈表長度為N)

【leetcode】鏈表的中間節(jié)點|鏈表中倒數(shù)第k個節(jié)點,數(shù)據(jù)結構,leetcode,鏈表,算法

由上圖可以發(fā)現(xiàn),輸出倒數(shù)第N個節(jié)點的邏輯與輸出倒數(shù)的k個節(jié)點的邏輯相同?

4??k=0或k>N(N為鏈表的長度)

  • k=0時,輸出鏈表的倒數(shù)第0個節(jié)點,應該為空

此時fast指針和slow指針都不會發(fā)生變化,,所以

  • k>N時,fast先走k步會發(fā)生空指針的訪問

在fast指針向后走k步的過程中,需要隨時檢查fast指針的有效性,如果fast==NULL,直接返回空指針即可

參考代碼如下:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
    // write code here
    struct ListNode* slow = pListHead,*fast = pListHead;
    if(pListHead)
    {
        while(k--)
        {
            if(fast == NULL)
            {
                return fast;
            }
            fast = fast->next;
        }
        while(fast)
        {
            slow = slow->next;
            fast = fast->next;
        }
    }

    return slow;

}

到了這里,關于【leetcode】鏈表的中間節(jié)點|鏈表中倒數(shù)第k個節(jié)點的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包