【1】题目
题目:输入一个链表,输出该链表中倒数第 k 个结点。为了符合大多数人的习惯,本题从1 开始计数,即链表的尾结点是倒数第1 个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。
【2】思路
【3】代码
test15.h
#pragma once
struct ListNode
{
int m_nValue;
ListNode * m_pNext;
};
void creat(ListNode *plistHead);
ListNode * FindKthToTail(ListNode * plistHead, unsigned int k);
test15.cpp
// test15.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include "test15.h"
#include <iostream>
ListNode * FindKthToTail(ListNode * plistHead, unsigned int k)
{
if (plistHead==NULL || k==0)
{
return NULL;
}
ListNode *pAHead = plistHead;
ListNode *PBHead = NULL;
for (unsigned int i = 0; i < k-1; ++i)
{
if (pAHead->m_pNext !=NULL)
{
pAHead = pAHead->m_pNext;
}
else
{
return NULL;
}
}
PBHead= plistHead;
while (pAHead->m_pNext != NULL)
{
pAHead = pAHead->m_pNext;
PBHead = PBHead->m_pNext;
}
return PBHead;
}
//创建单链表
void creat(ListNode *Head)
{
ListNode *plistHead = Head;
ListNode *plistHead1 = plistHead;
for (size_t i = 0; i < 10; ++i)
{
ListNode *NextNode = new ListNode;
NextNode->m_nValue = i;
NextNode->m_pNext = NULL;
plistHead->m_pNext = NextNode;
plistHead = NextNode;
}
//打印显示链表
while (plistHead1->m_pNext != NULL)
{
plistHead1 = plistHead1->m_pNext;
std::cout << plistHead1->m_nValue << std::endl;
}
}
int main()
{
ListNode *Head = new ListNode;
ListNode *Head1 = Head;
creat(Head);
std::cout <<"\n倒数第k个数字为:" << std::endl;
ListNode *KHead =FindKthToTail(Head1, 3);
std::cout << KHead->m_nValue << std::endl;
}