题目
输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第一个结点.
双指针实现一次遍历就能找到,要注意代码的鲁棒性.
code:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)
{
if (pListHead == NULL || k == 0)
{
return NULL;
}
ListNode* pFirst = pListHead;
ListNode* pSecond = NULL;
for (unsigned int i = 0; i < k - 1; ++i)
{
if (pFirst->m_pNext != NULL)
{
pFirst = pFirst->m_pNext;
}
else
{
return NULL;
}
}
pSecond = pListHead;
while (pFirst->m_pNext != NULL)
{
pFirst = pFirst->m_pNext;
pSecond = pSecond->m_pNext;
}
return pSecond;
}
测试代码:
#include <iostream>
using namespace std;
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
ListNode(int n) : m_nValue(n), m_pNext(NULL) {}
};
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)
{
if (pListHead == NULL || k == 0)
{
return NULL;
}
ListNode* pFirst = pListHead;
ListNode* pSecond = NULL;
for (unsigned int i = 0; i < k - 1; ++i)
{
if (pFirst->m_pNext != NULL)
{
pFirst = pFirst->m_pNext;
}
else
{
return NULL;
}
}
pSecond = pListHead;
while (pFirst->m_pNext != NULL)
{
pFirst = pFirst->m_pNext;
pSecond = pSecond->m_pNext;
}
return pSecond;
}
ListNode* CreateList()
{
int length;
cout << "Enter the length of linklist:";
cin >> length;
int number;
cout << "Enter the value of each number:";
ListNode* pHead = NULL;
ListNode* pTmp = NULL;
for (int i = 0; i < length; i++)
{
cin >> number;
ListNode* s = new ListNode(number);
if (!pHead)
{
pHead = s;
pTmp = s;
}
else
{
pTmp->m_pNext = s;
pTmp = s;
}
}
return pHead;
}
void PrintLinkList(ListNode* pHead)
{
if (pHead == NULL)
return;
while (pHead)
{
cout << pHead->m_nValue <<"-->";
pHead = pHead->m_pNext;
if (pHead->m_pNext == NULL)
{
cout << pHead->m_nValue <<"^";
break;
}
}
cout << endl;
}
void Test()
{
ListNode* p = CreateList();
PrintLinkList(p);
int k;
cout << "Enter k: ";
cin >> k;
ListNode* pTest = FindKthToTail(p,k);
if (pTest)
{
cout << "the kth value to tail is: "<<pTest->m_nValue<<endl;
}
else
{
cout << "Error!" <<endl;
}
}
int main()
{
Test();
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/nizhannizhan/article/details/47680711