题目:
输入一个链表,输出该链表中倒数第k个结点。
思路;
两个指针。一个指针先走k步,然后两个指针同时走,直到第一个指针走到最后,这样第二个指针就到了倒数第k个结点。
注意:k有可能大于链表长度。
代码:
#include <iostream>
using namespace std;
struct ListNode
{
int m_nValue;
ListNode *m_pNext;
ListNode(){}
ListNode(int x):m_nValue(x),m_pNext(NULL){}
};
//功能:返回链表的倒数第k个结点
ListNode * FindKthToTail(ListNode *pListHead , int k)
{
ListNode *p1 = pListHead , *p2 = pListHead;
if(pListHead == NULL || k == 0)
return NULL;
//第一个指针先走k步
for(int i = 0 ; i < k ; i++)
{
if(p1 == NULL)
return NULL;
p1 = p1->m_pNext;
}
//两个指针同时走len - k 步
while(p1)
{
p1 = p1->m_pNext;
p2 = p2->m_pNext;
}
return p2;
}
int main()
{
ListNode *p1 = new ListNode(1);
ListNode *p2 = new ListNode(2);
ListNode *p3 = new ListNode(3);
ListNode *p4 = new ListNode(4);
ListNode *p5 = new ListNode(5);
ListNode *p6 = new ListNode(6);
p1->m_pNext = p2;
p2->m_pNext = p3;
p3->m_pNext = p4;
p4->m_pNext = p5;
p5->m_pNext = p6;
ListNode *p = FindKthToTail(p1 , 3);
if(p)
cout<<p->m_nValue<<endl;
return 0;
}