您的位置:首页 > 其它

题目1517:链表中倒数第k个结点

2015-05-28 16:15 381 查看
时间限制:1 秒内存限制:128 兆题目描述:输入一个链表,输出该链表中倒数第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是否合理,在通过两个快慢指针找到倒数第k个节点。
#include <iostream>#include <cstdio>using namespace std;struct ListNode{int val;ListNode *next;ListNode(int _val) : val(_val) , next(NULL) {}};ListNode dummy(-1);int findK(ListNode *head, int n, int k){ListNode *p = head, *q = head;while(k){q = q -> next;k--;}while (q){q = q -> next;p = p -> next;}return p -> val;}void deleteNode(ListNode *head){if (head == NULL)return;deleteNode(head -> next);delete head;}int main(void){int n, k;while (scanf("%d%d", &n, &k) != EOF){ListNode *pre = &dummy;int val;for (int i = 0; i < n; ++i){scanf("%d", &val);pre -> next= new ListNode(val);pre = pre -> next;}if (k > n || k == 0)printf("NULL\n");else{printf("%d\n", findK(&dummy, n, k));}deleteNode(dummy.next);}return 0;}
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: