剑指Offer - 九度1517 - 链表中倒数第k个结点
2013-11-30 02:57
- 题目描述:
-
输入一个链表,输出该链表中倒数第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
题意分析:
给定一个单向链表,找出倒数第k个节点并输出节点值。可以先让一个指针p1从链表头开始跑k歩,然后指针p2指向链表头,两指针同步向前走,当p1走到NULL时,p2即指向倒数第k点。
不过,既然是处理链表,必然要步步为营,检查指针是否指向NULL。对一切“->”进行指诊检查,确保不发生内存错误。野指针是严重错误,面试里敢犯这等错误的话,估计Offer也就无缘了。
1 // 651911 zhuli19901106 1517 Accepted 点击此处查看所有case的执行结果 1552KB 1018B 100MS 2 // 201311152057 3 #include <cstdio> 4 #include <cstdlib> 5 using namespace std; 6 7 struct Node{ 8 int val; 9 struct Node *next; 10 Node(int _val = 0): val(_val), next(NULL){} 11 }; 12 13 int main() 14 { 15 int n, k, i; 16 int tmp; 17 struct Node *root = NULL; 18 struct Node *tail; 19 struct Node *p1, *p2; 20 21 root = new Node(0); 22 while(scanf("%d%d", &n, &k) == 2){ 23 tail = root; 24 for(i = 0; i < n; ++i){ 25 scanf("%d", &tmp); 26 tail->next = new Node(tmp); 27 tail = tail->next; 28 } 29 30 if(k > n || k < 1 || root->next == NULL){ 31 printf("NULL "); 32 continue; 33 } 34 35 p1 = p2 = root->next; 36 while(k > 0 && p1 != NULL){ 37 --k; 38 p1 = p1->next; 39 } 40 while(p1 != NULL){ 41 p1 = p1->next; 42 p2 = p2->next; 43 } 44 printf("%d ", p2->val); 45 46 while(root->next != NULL){ 47 tail = root->next; 48 root->next = tail->next; 49 delete tail; 50 } 51 } 52 53 delete root; 54 root = NULL; 55 56 return 0; 57 }