C/C++面试题—链表中倒数第k个结点

题目描述

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

解题思路

顺数第1个结点和顺数第k个结点
倒数第k个结点和倒数第1个结点
神马关系?顺数第k个结点指针走到倒数第1个结点时候,顺数第1个结点指针刚好走到倒数第k个结点

解题代码

/*

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

*/

#include <iostream>
#include "ListNode.h"
using namespace std;
class SolutionFindKthToTail {
public:
    /*
    node1 node2 ... nodek ....

    */
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if (pListHead == nullptr || k == 0)
            return nullptr;
        ListNode* pKthNode = pListHead;//顺数第k个结点
        ListNode* p1thNode = pListHead;//顺数第1个结点
        for (int i = 1; i < k; i++)
        {
            pKthNode = pKthNode->next;
            if (pKthNode == nullptr)    //k值不符合要求
                return nullptr;
        }
        while (pKthNode->next != nullptr)   //第1个结点和第k个结点同时往后移动
        {
            pKthNode = pKthNode->next;
            p1thNode = p1thNode->next;
        }//pKthNode移动到尾结点,p1thNode刚好称为倒数第k个结点
        return p1thNode;
    }
};

int main(int argc, char *argv[])
{
    SolutionFindKthToTail solution;
    ListNode node1(1);
    ListNode node2(2); node1.next = &node2;
    ListNode node3(3); node2.next = &node3;
    ListNode node4(4); node3.next = &node4;
    ListNode node5(5); node4.next = &node5;
    if (solution.FindKthToTail(&node1, 6) == nullptr)
    {
        cout << "没有找到" << endl;
    }
    cout << solution.FindKthToTail(&node1, 1)->val << endl;
    cout << solution.FindKthToTail(&node1, 2)->val << endl;
    cout << solution.FindKthToTail(&node1, 3)->val << endl;
    cout << solution.FindKthToTail(&node1, 4)->val << endl;
    cout << solution.FindKthToTail(&node1, 5)->val << endl;
    return 0;
}

代码测试

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_29542611/article/details/80552152