題目描述:
-
輸入一個鏈表,輸出該鏈表中倒數第k個結點。
(hint: 請務必使用鏈表。)
- 輸入:
-
輸入可能包含多個測試樣例,輸入以EOF結束。
對於每個測試案例,輸入的第一行為兩個整數n和k(0<=n<=1000, 0<=k<=1000):n代表將要輸入的鏈表元素的個數,k代表要查詢倒數第幾個的元素。
輸入的第二行包括n個數t(1<=t<=1000000):代表鏈表中的元素。
- 輸出:
-
對應每個測試案例,
若有結果,輸出相應的查找結果。否則,輸出NULL。
- 樣例輸入:
5 2 1 2 3 4 5 1 0 5
- 樣例輸出:
4 NULL
解題思路:
首先我們考慮到,用普通的思想,獲取鏈表的長度,然后輸出第length-k個元素的值,就是倒數第k個元素的值了。但是考慮到面試的技巧,這種方法還是不行的,但是做題時可以AC的。代碼如下,把所有的鏈表相關的東西刪除,仍然可以AC。
#include <stdio.h> #include <stdlib.h> typedef struct node{ int number; struct node * next; }Node; int main(){ int n,k,i,temp; int flag = 0; Node *link = (Node *)malloc(sizeof(Node)); link->next = NULL; while(scanf("%d %d",&n,&k)!=EOF && n>=0 && n<=1000 && k>=0 && k<=1000 ){ flag = 0; for(i=0;i<n;i++){ scanf("%d",&temp); if(i == n-k){ flag = 1; printf("%d\n",temp); } Node *n = (Node *)malloc(sizeof(Node)); n->next = link->next; link->next = n; n->number = temp; } if(!flag) printf("NULL\n"); } return 0; } /************************************************************** Problem: 1517 User: xhalo Language: C Result: Accepted Time:100 ms Memory:2496 kb ****************************************************************/
但是考慮的復雜點,如果時間復雜度為O(n)呢,一次掃描是不可能獲取長度,又輸出的。
因此采取判斷鏈表循環的思路,采用兩個指針,第一個指針提前k-1步向下走,第二個指針再隨着第一個指針一直走。知道第一個指針指向末尾,第二個指針的元素的值,便是我們所要求得的值。
p1 = link->next; for(i=1;i<k;i++){ p1 = p1->next; } p2 = link->next; while(p1->next!=NULL){ p1 = p1->next; p2 = p2->next; } return p2->number;
但是考慮到特殊情況:
1 如果輸入的k是0,也就是說是個非法的值。解決辦法
2 如果鏈表為空,根本找不到要查找的值。解決辦法
if(link->next == NULL || k == 0) return -1;
3 如果p1已經到了鏈表的末尾,而p2還沒有開始,也就是說,鏈表的長度根本不夠k個,怎么辦呢?解決辦法
p1 = link->next; for(i=1;i<k;i++){ if(p1->next == NULL) return -1; p1 = p1->next; }
全部代碼:
#include <stdio.h> #include <stdlib.h> typedef struct node{ int number; struct node * next; }Node; int getK(Node *link,int k); int main(){ int n,k,i,temp; int flag; while(scanf("%d %d",&n,&k)!=EOF && n>=0 && n<=1000 && k>=0 && k<=1000 ){ Node *link = (Node *)malloc(sizeof(Node)); link->next = NULL; flag = 0; Node *tail; tail = link; for(i=0;i<n;i++){ scanf("%d",&temp); Node *n = (Node *)malloc(sizeof(Node)); n->next = tail->next; tail->next = n; tail = tail->next; n->number = temp; } int numberK = getK(link,k); numberK ==-1?printf("NULL\n"):printf("%d\n",numberK); } return 0; } int getK(Node *link,int k){ Node *p1,*p2; int i; if(link->next == NULL || k == 0) return -1; p1 = link->next; for(i=1;i<k;i++){ if(p1->next == NULL) return -1; p1 = p1->next; } p2 = link->next; while(p1->next!=NULL){ p1 = p1->next; p2 = p2->next; } return p2->number; } /************************************************************** Problem: 1517 User: xhalo Language: C Result: Accepted Time:100 ms Memory:2496 kb ****************************************************************/