鍊錶中的倒數第k個節點

2021-10-01 03:12:20 字數 1549 閱讀 6114

鍊錶中的倒數第k個節點

主要思路設定兩個指標,剛開始都指向鍊錶的第乙個節點,第乙個指標先走k-1步,然後兩個一塊走,直到第乙個指標的下一位為nullptr,則第二個指標所指的位置就是倒數第k個節點。

分為兩種情況:1、倒數第k個位置在正數第k個位置之後,如圖:

此種情況下:p_head和nullptr分別表示鍊錶的頭位置和末位置,+k表示正數第k個位置,-k表示倒數第k個位置,first指標代表已經走了k-1個位置之後的第乙個指標位置,second表示第二個指標從起始位置開始。

然後first和second一塊開始走,直到first->next指向nullptr,即first_end的位置,此時second走到second_end,second_end即是倒數第k個位置。first和second走過的長度都是藍色區域加黃色區域的長度。

2、倒數第k個位置在正數第k個位置之前,如圖:

此種情況下:p_head和nullptr分別表示鍊錶的頭位置和末位置,+k表示正數第k個位置,-k表示倒數第k個位置,first指標代表已經走了k-1個位置之後的第乙個指標位置,second表示第二個指標從起始位置開始。

然後first和second一塊開始走,直到first->next指向nullptr,即first_end的位置,此時second走到 second_end,second_end即是倒數第k個位置。first和second走過的長度都是黃色區域的長度。

其實還有第三種情況:就是比較特殊的-k=+k的情況,即倒數第k個位置就是正數第k個位置(中間位置),但這種情況可以歸類為以上兩種情況的任意一種,不做特殊處理。

例如:鍊錶1 2 3 4 5 6 7 求倒數第二個節點的值

1、兩個指標都指向煉表頭節點

2、第乙個節點先走 k-1 =2-1 =1步,然後兩個節點同時走

3、第乙個節點走5步走到尾節點,此時第二個節點走5步至6這一節點,即為所求節點。

**實現:

**1:

public class solution

k--;

}//如果節點個數小於所求的倒數第k個節點,則返回空

if(counttotalnum)

listnode resultnode = head;

for(int i=0;i<=totalnum-k+1;i++)

return resultnode.tostring();

}

開始想的是,倒數第k個結點就是從頭結點開始的第n-k+1個結點。如果我們能夠得到鍊錶中結點的個數n,那我們只要從頭結點開始往後走n-k+1步就可以了。那麼,這裡的重點就在於如何求煉表中節點的個數n,只需要從頭開始遍歷鍊錶,每經過乙個結點,計數器加1就行了。但是,這種思路需要遍歷鍊錶兩次,第一次統計出煉表中結點的個數,第二次才能找到倒數第k個結點。可行,但不高效。但是,屬於菜鳥的我,能做出來就已經阿彌陀佛了。^ ^

鍊錶中倒數第k個節點

題目 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。struct listnode方法 定義兩個指標。第乙個指標從鍊錶的頭指標開始遍歷向前走k 1,第二個指標保持不動 從第k步開始,第二個指標也開始從鍊錶的頭指標開始遍歷。由於兩個指標的距離保持在k 1,當第乙個 走在前面的 指標到達鍊錶的尾結點時,第二...

鍊錶中倒數第k個節點

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。ac class solution def findkthtotail self,head,k write code here 將每個節點存在棧裡,選取stack中第k個值 stack while head head head.next if k len s...

鍊錶中倒數第k個節點

acwing打卡活動 劍指offer 打卡活動 周二第十題 鍊錶中倒數第k個節點 definition for singly linked list.public class listnode 思路 設列表總結點數為n,則n k 1 為該列表的倒數第k個節點 如 n 10,k 2,則 10 2 1 ...