查找单链表中倒数第k个元素

/*
问题描述:查找单链表中倒数第k个元素
说明:这个题直接想到的就是先遍历整个链表,得到链表的长度length,然后再次遍历第length-k个元素,即是所求的结点。
查了相关资料,牛人自有新招。可以用两个指针p,q,一开始两个指针均指向开始处q指针先走k步(前移k个结点),然后p结点和q结点一起移动,当q结点到达尾部时,p结点就是所求的结点。这个算法,仔细想想就是q指针比p指针多走了k步,总共q走完了length,那么p自然到达length-k.
这种思路使得只要遍历一次单链表就可实现目的。

*/

//查找单链表中倒数第k个元素
int SearchReverse_k(LinkList  L,int k)
{

    LNode *p,*q;    //两个指针
    int coun = 0;

    q = L->next;

    while(q != NULL)    //先将q指针向前移动k个位置
    {
        q = q->next;
        if(++coun >= k)
            break;

    }

    //输入出错处理
    if(q == NULL || k<=0 )
    {
        if(coun != k)
        {
            cout<<"k is illegal,return -1"<<endl;
            return -1;
        }


    }

    p = L->next;

    while(q != NULL)    //p和q一起移动,当q到达末尾的时候,p就是所需的结点
    {
        q = q->next;
        p = p->next;
    }

    return p->data;

}

总结:本问题的算法思路还可以用于其他关于链表位置、长度有差别的问题上。比如说:求两个链表的公共结点。没猜错的话,这叫做双指针法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值