剑指Offer - 九度1517 - 链表中倒数第k个结点
2013-11-30 03:06
344 查看
剑指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也就无缘了。
// 651911 zhuli19901106 1517 Accepted 点击此处查看所有case的执行结果 1552KB 1018B 100MS // 201311152057 #include <cstdio> #include <cstdlib> using namespace std; struct Node{ int val; struct Node *next; Node(int _val = 0): val(_val), next(NULL){} }; int main() { int n, k, i; int tmp; struct Node *root = NULL; struct Node *tail; struct Node *p1, *p2; root = new Node(0); while(scanf("%d%d", &n, &k) == 2){ tail = root; for(i = 0; i < n; ++i){ scanf("%d", &tmp); tail->next = new Node(tmp); tail = tail->next; } if(k > n || k < 1 || root->next == NULL){ printf("NULL\n"); continue; } p1 = p2 = root->next; while(k > 0 && p1 != NULL){ --k; p1 = p1->next; } while(p1 != NULL){ p1 = p1->next; p2 = p2->next; } printf("%d\n", p2->val); while(root->next != NULL){ tail = root->next; root->next = tail->next; delete tail; } } delete root; root = NULL; return 0; }
相关文章推荐
- 【剑指Offer面试题】 九度OJ1517:链表中倒数第k个结点
- 【剑指Offer面试题】 九度OJ1517:链表中倒数第k个结点
- 【九度OJ1517】|【剑指offer15】链表中倒数第k个结点
- 剑指offer-题目1517:链表中倒数第k个结点 (2013.12.29)
- [剑指offer-1517]链表中倒数第k个结点
- 【剑指Offer面试编程题】题目1517:链表中倒数第k个结点--九度OJ
- 【剑指Offer面试编程题】题目1517:链表中倒数第k个结点--九度OJ
- 剑指offer--面试题15:链表中倒数第K个结点--Java实现
- [剑指offer]链表中倒数第k个结点
- 剑指offer--面试题15:链表中倒数第k个结点
- 【剑指offer】面试题15:链表中倒数第k个结点
- 九度oj 1517 链表中倒数第k个结点
- 剑指offer:输出该链表中倒数第k个结点
- 剑指Offer:链表中倒数第k个结点
- 题目1517:链表中倒数第k个结点-九度
- 剑指offer-链表中倒数第K个结点
- 剑指offer之面试题15 :链表中倒数第k个结点
- 剑指offer【22】求链表倒数第K个结点
- 剑指offer之链表中倒数第k个结点
- 剑指offer面试题15——链表中倒数第k个结点