剑指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\n");
continue;
}
Head = createLinkList(N);
Ret = findKey(Head, N, K);
if (Ret == NULL)
{
printf("NULL\n");
}
else
{
printf("%d\n", Ret->data);
}
destroyLinkList(&Head);
}
return 0;
}
/**************************************************************
Problem: 1517
User:
Language: C
Result: Accepted
Time:100 ms
Memory:912 kb
****************************************************************/