这题也是网上的老题了,查过的人都知道这题应该使用快慢指针。定义一个指针先走K-1步,然后两个指针一起走,当快得指针走到尽头时慢的指针此处就在K的位置,但是这题还有一个问题,鲁棒性没有考虑,当k>n时怎么办,当head=null时怎么办,当n=0时怎么办,如果不考虑的话就会导致崩溃。当head为NULL或者n=0的情况,我们可以在程序执行的开始进行判断,至于k>n我们在快指针在走k-1步的过程中,判断一下是否为空,如果为空的话也没有必要再执行了。
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
struct LinkList
{
int mValue;
LinkList *next;
};
int FindKthTotail(LinkList *head,int k)
{
if(head==NULL||head->next==NULL||k==0)return -1;
LinkList *headk=head;
for(int i=0;i<k-1;i++)
{
headk=headk->next;
if(headk->next==NULL)
return -1;
}
while(headk->next!=NULL)
{
//cout<<headk->mValue<<" "<<head->mValue<<endl;
head=head->next;
headk=headk->next;
}
if(head!=NULL)
return head->mValue;
else
return -1;
}
int main()
{
// freopen("/Users/sanyinchen/Workspaces/oc/conse/B_ali/B_ali/in.txt","r",stdin);
int a[1001],n,m;
while(scanf("%d %d",&m,&n)!=EOF)
{
for(int i=0;i<m;i++)
scanf("%d",&a[i]);
LinkList* head=new LinkList();
LinkList* t;
t=head;
for(int i=0;i<m;i++)
{
LinkList *s=new LinkList();
s->mValue=a[i];
t->next=s;
t=s;
}
t->next=NULL;
int code=FindKthTotail(head,n);
if(code==-1)
printf("NULL\n");
else
printf("%d\n",code);
}
return 0;
}