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

题目链接

https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&tqId=11167&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题意

求链表倒数第k个节点,计数从1开始。

题解

  • 法一:遍历两遍。
    第一遍求链表长度,第二遍直接找到节点。
  • 法二:遍历一遍。双指针指向链表头部,第一个指针先走k-1个,然后两个指针同步走,当先走的指针走到链表尾节点,后走的指针指向的就是倒数k个节点。 - 关于鲁棒性:要考虑指针为nullptr、k=0、k大于链表长度的三种特殊情况。

相关知识

可以多考虑用双指针指向链表解题(与链表结点位置相关题目),类似的,若求链表中点:遍历一遍的做法是,两个指针同时同头部出发,一个每次走一步,另一个每次走两步,则当快的指针走到尾节点,慢的指针即指向中间节点。

法二代码

class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if(!pListHead||k==0){
            return nullptr;
        }
        ListNode* pFast=pListHead;
        ListNode* pSlow=pListHead;
        int step=k-1;
        while(step--){
            if(!pFast->next){//注意,否则经过下一步pFast指针将指向尾后节点,即k大于链表长度了。
                return nullptr;
            }
            pFast=pFast->next;
        }
        while(pFast->next){
            pFast=pFast->next;
            pSlow=pSlow->next;
        }
        return pSlow;
    }
};

猜你喜欢

转载自www.cnblogs.com/coding-gaga/p/10485900.html