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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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的方法一样,若走的快的指针与走的慢的指针相遇,则有环,若走的快的指针已经到了末尾也没有追上走得慢的指针,则无环。

以上是关于剑指offer编程-链表中倒数第k个结点的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer:链表中倒数第k个结点

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

链表中倒数第k个结点-剑指Offer

剑指Offer-Java-链表中倒数第k个结点

剑指Offer-链表中倒数第k个结点

《剑指Offer》题目:链表中倒数第k个结点