剑指offer之链表中倒数第K个节点

题目描述

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

解题思路

之前的错误思路想要把链表翻转过了,结果超时GG了。。。。。正确的思路应该是双指针法!!!!
第一个指针先走k-1步,第二个指针从头结点开始。两者同时开始走,当第一个走到结尾时,第二个就是倒数第k个节点。。。如果第一个直接是空指针,那么第二个就是倒数第k个。。。。WTF,还是做的题目少,没有有关的思路啊。。。。

AC代码

代码一定要注意边界条件!!!!即使题目没说,也得看边界!!!!!!!

class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if(pListHead == nullptr || k == 0) {    // 注意边界条件!!!!
            return nullptr;
        }
        auto p1 = pListHead, p2 = pListHead;
        for(int i = 1; i < k; ++i) {  // 往后走k-1步
            p1 = p1->next;
            if(p1 == nullptr) {  // 注意边界条件!!!!!
                return nullptr;
            }
        }
        if(p1 == nullptr) {
            return p2;
        }
        while(p1->next != nullptr) {
            p1 = p1->next;
            p2 = p2->next;
        }
        return p2;
    }
};

你可能感兴趣的:(剑指offer)