剑指Offer之链表中倒数第K个节点

这题也是网上的老题了,查过的人都知道这题应该使用快慢指针。定义一个指针先走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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值