劍指offer刷題 鍊錶中倒數第K個結點

2021-10-01 05:55:44 字數 1502 閱讀 3765

題目:鍊錶中倒數第k個結點

輸入乙個鍊錶,求出鍊錶中倒數第k個結點。為了符合大多數人的習慣,本題從1開始計數,即鍊錶的尾結點是倒數第乙個結點。例如乙個鍊錶有6個結點,從頭開始它們的值依次是1、2、3、4、5、6。這個鍊錶的倒數第3個結點是值為4的結點。

有一種最直接的方法是將鍊錶遍歷兩遍,第一遍得到鍊錶長度,第二遍去找第k個結點。這種方式不免太麻煩。

我們可以設定兩個指標ahead和behind,先將第ahead遍歷到從頭開始的第k-1個結點處,然後另behind置於頭節點處,這樣behind就是相對於ahead之處的倒數第k個結點,然後我們將兩個指標一步一步向後移,這樣當,ahead移至鍊錶末尾處的時候,behind就是鍊錶的到時第k個結點。

上圖展示了求鍊錶倒數第三個結點的過程。

在寫**的時候,我們要考慮**的魯棒性。

struct listnode

;void insertnode(listnode *head, int value)

listnode* findkthtotail(listnode* plisthead, unsigned int k)

listnode* pahead = plisthead;

listnode* pbehind = nullptr;

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

else

}pbehind = plisthead;

while (pahead->m_pnext != nullptr)

return pbehind;

}void destroy(listnode* head)

else

}free(head);

}

測試:

listnode* head = new listnode;

head->m_nvalue = 1;

head->m_pnext = nullptr;

insertnode(head, 6);

insertnode(head, 5);

insertnode(head, 4);

insertnode(head, 3);

insertnode(head, 2);

listnode* node = head;

while (node != nullptr)

cout << endl;

cout << findkthtotail(head, 3)->m_nvalue << endl;

destroy(head);

結果:

劍指offer刷題(十三)鍊錶中倒數第k個結點

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。用兩個指標,指標p q最開始都指向 head,p 先向右移動 k 位,然後 p 和 q 再一起同步向右移動,當 p 到達邊界時 p指向空 q 正好指向了倒數第 k 個結點 做完這些還不能通過牛客網的測試,因為出現了 k 會大於整個鍊錶長度的情況,因此在 p ...

劍指offer刷題 22 鍊錶倒數第k個節點

難度 簡單 題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。注 考察單向鍊錶 思路 為了實現只遍歷一次鍊錶就能找到倒數第k個節點。利用兩個指標ptr1,ptr2實現,第乙個指標ptr1從煉表頭遍歷向前走k 1步,ptr2保持不動 從第k步開始,第二個指標開始從煉表頭遍歷,由於兩隻指標保持k 1的...

劍指offer 第14題 鍊錶中倒數第k個結點

輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。雙指標,p1先走k步,然後同時走,p1到頭時候返回p2 倒數第k個就是正數第n k 1個,從第乙個結點到第n k 1個結點一共要走n k步,從第k 1個結點到n 1個結點也是n k步,從第乙個結點到第k 1個結點,走k步 coding utf 8 class...