题目1517:链表中倒数第k个结点
时间限制:1 秒内存限制:128 兆特殊判题:否提交:1674解决:750
题目描述:
输入一个链表,输出该链表中倒数第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<iostream>
#include<stdio.h>
using namespace std;
int main(){
int n,k;
while(scanf("%d%d",&n,&k)!=EOF){
int * a = new int[n];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
if(k>n||k<=0){
printf("NULL\n");
}
else{
printf("%d\n",a[n-k]);
}
}
return 0;
}
链表解法:
#include<stdio.h>
#include<iostream>
using namespace std;
struct ListNode {
int value;
ListNode* next;
};
int find(ListNode* pHead,int k){
if(pHead==NULL||k<=0){
return NULL;
}
ListNode* aHead = pHead;
ListNode* bHead = pHead;
int i=0;
for(i=0;i<k-1;i++){
if(aHead->next!=NULL){
aHead = aHead->next;
}else
break;
}
if(i!=k-1){
return NULL;
}
while(aHead->next!=NULL){
aHead= aHead->next;
bHead=bHead->next;
}
return bHead->value;
}
int main(){
int n,num,k;
while(scanf("%d%d",&n,&k)!=EOF){
ListNode* pHead;
ListNode* root;
for(int i=0;i<n;i++){
scanf("%d",&num);
ListNode* pNew = new ListNode();
pNew->value = num;
pNew->next = NULL;
if(i==0){
pHead= root=pNew;
}else{
pHead->next= pNew;
pHead = pHead->next;
}
}
if(find(root,k)==NULL){
printf("NULL\n");
}else{
printf("%d\n",find(root,k));
}
}
return 0;
}