-
输入一个链表,输出该链表中倒数第k个结点。
(hint: 请务必使用链表。)
时间限制:1 秒
内存限制:128 兆
题目描述:
-
输入:
-
输入可能包含多个测试样例,输入以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; }