链表---链表的倒数第k个节点

找链表的倒数第k个节点???

思路:遍历一遍链表,得到链表的长度len, 再用长度len减掉k就是需要走多少步就能倒数第k个节点的位置了。

 

如图有一个链表,有效数据长度 len为5;假设现在要找倒数第三个节点。即k为3;

如果当前指针指向头节点,则需要走len-k+1步(值为3),才能到倒数第k个节点

如果指向的是第一个有效数据节点,则需要走len-k(值为2)步。

node * Find_tail_K(P plist,unsigned int k)

{
    if(NULL == plist || k<1)
    {
        return NULL;
    }
    int count=0;
    for(node *p=plist->pnext;p!=NULL;p=p->pnext)
    {
        count++;
    }
    if(count<k)
    {
        return NULL;
    }
    int tmp=count-k;
    node *q=plist->pnext;//第二种情况,从第一个有效节点开始
    for( int i=1;i<=tmp;i++)
    {
        q=q->pnext;
    }
    return q;
}

到这里就算是完成了题目要求,但是现在只要求遍历一次链表,有应该如何实现呢??(上面一共遍历了两遍链表)

思路:定义两个指针p1、p2都指向第一个有效节点,然后p2先走k-1步,这样就能保证p1和p2之间一共有k个节点了(包括p1,p2),然后两个指针同时走,当p2走到尾的时候,p1指向的节点就是倒数第k个节点。

node * find_tail_k(P plist,unsigned int k)

{

    if(NULL == plist ||k<1)

    {

        return NULL;

    }

    node *p1=plist->pnext;

    node *p2=plist->pnext;
    
    for(int i=1;i<k;i++)

    {

        if(p2->pnext!=NULL)

            p2=p2->pnext;

        else 

            return NULL;

    }

    for(;p2->pnext!=NULL;p2=p2->pnext)
    {
        p1=p1->pnext;
    }

    return p1;

}
扫描二维码关注公众号,回复: 2772557 查看本文章

猜你喜欢

转载自blog.csdn.net/ShWe_yayaya/article/details/81633353
今日推荐