题目描述
输入一个链表,输出该链表中倒数第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;
}