剑指offer编程-链表中倒数第k个结点

题目描述

输入一个链表,输出该链表中倒数第k个结点。

思路:

1.遍历链表得到链表的长度l,找到从前往后的第l-k+1个节点。需要遍历两遍。
2.遍历一次即可的方法:两个指针,第一个指针从头向尾移动k-1步后第二个指针开始从头向尾移动,第一个指针到尾结点时第一个指针指向倒数第k个结点。
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if(pListHead==NULL || k==0)
            return NULL;
  
        ListNode *pAhead=pListHead;
        ListNode *pBehind=NULL;
        for(int i=1;i<k;i++){
            pAhead=pAhead->next;
            if(pAhead==NULL)
                return NULL;
        }
        
        pBehind = pListHead;
        while(pAhead->next != NULL){
            pAhead=pAhead->next;
            pBehind=pBehind->next;
        }
        return pBehind;
    }

测试用例:

  1. 功能测试(第k个节点在链表的中间,第k个节点在链表的头节点,第k个节点在链表的尾结点)
  2. 特殊输入(链表的头节点为NULL,链表长度小于k,k等于0)

注意:

考虑特殊用例,上面测试用例中的特殊输入,增加代码的鲁棒性。

当用一个指针遍历链表不能解决问题时,可以尝试两个指针或多个指针以不同步长移动以达到目的。

相关题目:

1.求链表的中间节点:定义两个指针,同时从头节点除法,一个一次走一个节点,一个一次走两个节点,走得快的指针走到末尾时,走得慢的指针指向中间节点。

2.判断一个单向链表是否形成了环形结构:和1的方法一样,若走的快的指针与走的慢的指针相遇,则有环,若走的快的指针已经到了末尾也没有追上走得慢的指针,则无环。

转载于:https://www.cnblogs.com/sjhome/p/7605532.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值