-
题目描述:
-
输入一个链表,输出该链表中倒数第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 ListNode{
int value;
struct ListNode *next;
}ListNode,*LinkList;
void FindKthToTail(LinkList *head,int k);
void CreateList(LinkList *head,int n);
void DeleteList(LinkList *head);
int main(void)
{
int n,k;
LinkList head = NULL;
while(scanf("%d%d",&n,&k) != EOF){
if(n <=0 || n<k || k<1){
printf("NULL\n");
continue;
}
CreateList(&head,n);
FindKthToTail(&head,k);
DeleteList(&head);
}
return 0;
}
void FindKthToTail(LinkList *head,int k)
{
LinkList pBefore,pAfter;
pBefore = pAfter = *head;
for(int i = 1;i < k;++i)
pAfter = pAfter->next;
while(pAfter->next){
pAfter = pAfter->next;
pBefore = pBefore->next;
}
printf("%d\n",pBefore->value);
}
void CreateList(LinkList *head,int n)
{
LinkList p = *head;
int e;
for(int i = 0;i < n;++i){
scanf("%d",&e);
LinkList q = (LinkList)malloc(sizeof(ListNode));
if(!q)
exit(-1);
q->value = e;
q->next = NULL;
if(p == NULL){
p = *head = q;
}
else{
p->next = q;
p = q;
}
}
}
void DeleteList(LinkList *head)
{
if(*head){
DeleteList(&((*head)->next));
free(*head);
*head = NULL;
}
}