题目描述:
输入一个链表,输出该链表中倒数第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 Node{
int value;
struct Node* next;
}Node,*pNode;
pNode FindKthToTail(pNode head , unsigned int k){
if(head == NULL || k==0)
return NULL;
pNode p1 = head;
for (int i = 0; i < k-1; i++) {
if(p1->next != NULL){
p1 = p1->next;
}else{
return NULL;
}
}
pNode p2 = head;
while(p1->next != NULL){
p1 = p1->next;
p2 = p2->next;
}
return p2;
}
pNode createList(int n){
pNode head = NULL;
pNode current = NULL;
while(n--){
int value;
scanf("%d",&value);
pNode newNode = (pNode)malloc(sizeof(Node));
newNode->value =value;
newNode->next = NULL;
if(head == NULL){
head = newNode;
current = head;
}else{
current->next = newNode;
current = current->next;
}
}
return head;
}
int main(int argc, const char * argv[]) {
int n , k;
while(scanf("%d %d",&n,&k) != EOF){
pNode head =createList(n);
pNode kTh = FindKthToTail(head, k);
if(kTh)
printf("%d\n",kTh->value);
else
printf("NULL\n");
}
return 0;
}