034链表中倒数第k个结点(keep it up)

2015-01-27 10:00:48 · 作者: · 浏览: 16

?

?

题目描述:

输入一个链表,输出该链表中倒数第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 ****************************************************************/
             
            


?