?
?
- 题目描述:
-
输入一个链表,输出该链表中倒数第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
这个题目比较简单直接上代码:?
?
#include#include typedef struct SNode { int data; struct SNode *next; }SNode; SNode* createNode(int vData) { SNode *Node = (SNode*)malloc(sizeof(SNode)); Node->data = vData; Node->next = NULL; return Node; } void deleteNode(SNode **vNode) { (*vNode)->next = NULL; free(*vNode); *vNode = NULL; } SNode* createLinkList(int vN) { int i; int Data; SNode *Head; SNode *Node; SNode *TempNode; scanf(%d, &Data); Head = createNode(Data); TempNode = Head; for (i = 1; i < vN; ++i) { scanf(%d, &Data); Node = createNode(Data); TempNode->next = Node; TempNode = Node; } return Head; } SNode* findKey(SNode *vHead, int vN, int vK) { if (vN == vK) return vHead; int i; SNode *pNode; SNode *qNode; i = 0; pNode = vHead; qNode = vHead; while (i < vK && qNode != NULL) { qNode = qNode->next; ++i; } if (qNode == NULL) return NULL; while (qNode != NULL) { pNode = pNode->next; qNode = qNode->next; } return pNode; } void destroyLinkList(SNode **vHead) { SNode *Node; while (*vHead != NULL) { Node = (*vHead)->next; deleteNode(vHead); *vHead = Node; } } int main() { int N; int K; SNode *Head; SNode *Ret; while (scanf(%d %d, &N, &K) != EOF) { if (K == 0 && K > N) { printf(NULL ); continue; } Head = createLinkList(N); Ret = findKey(Head, N, K); if (Ret == NULL) { printf(NULL ); } else { printf(%d , Ret->data); } destroyLinkList(&Head); } return 0; } /************************************************************** Problem: 1517 User: Language: C Result: Accepted Time:100 ms Memory:912 kb ****************************************************************/
?