{面试题15: 链表中倒数第 k 个节点}

From 剑指Offer 何海涛 著

#include <iostream>

struct ListNode {
    int m_nValue;
    ListNode *m_pNext;
};

ListNode* findKthToTail(ListNode *head, unsigned int k) {
    ListNode *first = head;
    ListNode *second = head;
    unsigned int num = 0;
    while(num < k && first != NULL) {
        first = first->m_pNext;
        num++;
    }
    if(num < k) { // 不能用 first == NULL 来代替, 因为 first == NULL 无法区分 num < k, num == k 两种情况
        return NULL;
    }
    while(first != NULL) {
        first = first->m_pNext;
        second = second->m_pNext;
    }
    return second;
}

测试集:

void test(ListNode *head, unsigned int k, ListNode *expected) {
    std::cout << std::boolalpha << (findKthToTail(head, k)== expected) << std::endl;
}

int main(int argc, char* argv[]) {
    ListNode node1 = {1, NULL};
    ListNode node2 = {2, &node1};
    ListNode node3 = {3, &node2};
    ListNode node4 = {4, &node3};
    ListNode node5 = {5, &node4};
    
    test(NULL, 0, NULL);
    test(NULL, 2, NULL);

    test(&node5, 0, NULL);
    test(&node5, 1, &node1);
    test(&node5, 3, &node3);
    test(&node5, 4, &node4);
    test(&node5, 5, &node5);
    test(&node5, 6, NULL);
    
    return 0;

}
原文地址:https://www.cnblogs.com/long3216/p/4438371.html