直接上**,希望大家喜歡。`
//輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。
#include
#include
typedef struct nodelink;
link *createlink(int a)
}return head;}/*
可行但不高效的常規解法:假設整個鍊錶有n個結點,那麼倒數第k個結點就是從頭結點開始的第n-k+1個結點。
如果我們能夠得到鍊錶中結點的個數n,那我們只要從頭結點開始往後走n-k+1步就可以了。那麼,
這裡的重點就在於如何求煉表中節點的個數n,只需要從頭開始遍歷鍊錶,每經過乙個結點,計數器加1就行了。
但是,問題來了:這種思路需要遍歷鍊錶兩次,第一次統計出煉表中結點的個數,第二次才能找到倒數第k個結點。
*/link* findk2(link *head,int k)
return p;}/*
可行且高效的解法:為了能夠只遍歷一次就能找到倒數第k個節點,可以定義兩個指標:
(1)第乙個指標從鍊錶的頭指標開始遍歷向前走k-1,第二個指標保持不動;
(2)從第k步開始,第二個指標也開始從鍊錶的頭指標開始遍歷;
(3)由於兩個指標的距離保持在k-1,當第乙個(走在前面的)指標到達鍊錶的尾結點時,
第二個指標(走在後面的)指標正好是倒數第k個結點。
*/link* findk1(link *head,int k)
p2=head;
while(p1)
return p2;
}int main()
; head=createlink(a);
p1=findk1(head,3);
p2=findk2(head,3);
printf("%d",p1->data);
printf("%d",p2->data);
return
0;}
今日面試題,拿來回憶回憶。 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。
1,問題 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。2,想法都在 裡標註了 struct listnode class solution int count 0 listnode temp plisthead while plisthead int m count k 倒數第k個,是順數第count...
輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點
思路 兩個指標,先讓第乙個指標和第二個指標都指向頭結點,然後再讓第乙個指正走 k 1 步,到達第k個節點。然後兩個指標同時往後移動,當第乙個結點到達末尾的時候,第二個結點所在位置就是倒數第k個節點了。public class solution public listnode findkthtotai...
輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。
題目描述 輸入乙個鍊錶,輸出該鍊錶中倒數第k個結點。解題思路 1.先遍歷鍊錶,獲得鍊錶中的總結點數。2.倒數第k個元素,即為順數第 size k 1 個元素。3.遍歷鍊錶,獲得第 size k 1的元素。public class listnode public class solution 統計鍊錶...