劍指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
****************************************************************/