题目:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值一次是1,2,3,4,5,6.这个链表的倒数第3个结点是值为4的结点。
链表结点定义如下:
struct ListNode
{
int iValue;
ListNode *pNext;
};
程序代码如下:
#include <iostream>
struct ListNode
{
int iValue;
ListNode *pNext;
};
void CreateList(ListNode*& pHead, int *arr, int len)
{
pHead = (ListNode *)malloc(sizeof(ListNode));
pHead->pNext = NULL;
if (arr == NULL || len <= 0)
{
pHead = NULL;
return;
}
ListNode *pNext = pHead, *s;
for (int i = 0; i < len; i++)
{
s = (ListNode*)malloc(sizeof(ListNode));
s->iValue = arr[i];
pNext->pNext = s;
pNext = pNext->pNext;
}
pNext->pNext = NULL;
pHead = pHead->pNext;
}
ListNode* FindKthNodeToTail(ListNode* pHead, int k)
{
if (pHead == NULL || k <= 0)
{
return NULL;
}
ListNode* pToTail = pHead, *pToKthToTail = pHead;
while (pToTail && k)
{
pToTail = pToTail->pNext;
k--;
}
if (k)
{
return NULL;
}
while (pToTail)
{
pToTail = pToTail->pNext;
pToKthToTail = pToKthToTail->pNext;
}
return pToKthToTail;
}
void PrintList(ListNode *pHead)
{
while (pHead)
{
std::cout << pHead->iValue << " ";
pHead = pHead->pNext;
}
std::cout << std::endl;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5, 6 ,7, 8 ,9 };
ListNode *pHead, *pNode;
CreateList(pHead, arr, 9);
PrintList(pHead);
pNode = FindKthNodeToTail(pHead, 8);
if (pNode)
{
std::cout << pNode->iValue << std::endl;
}
system("pause");
return 0;
}