題目:鍊錶中倒數第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...