剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1517
- 题目描写叙述:
-
输入一个链表。输出该链表中倒数第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 <stdio.h> #include <stdlib.h> 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 ****************************************************************/