题目:输入一个链表,输出该链表的倒数第k个节点。从1开始计数,即链表的尾节点为倒数第1个节点。
解答:首先自然想到的是寻找倒数第k个节点,那么就是从前往后数第n-k+1个节点,则先对链表遍历一遍得到链表的长度,然后第二次遍历时走n-k+1步就可以了。但是该方法需要对链表遍历两次,有没有只需要遍历依次的方法?自然是有的,可以想到用两个指针的方法,先让第一个指针先走k-1步,然后第二个指针指向链表的第1个节点,然后两个指针同时往后走,当第二个指针达到尾节点时,第一个指针指向的正是倒数第k个节点。
struct Node{
int m_data;
Node* m_pNext;
Node(const int data = 0,Node* next = NULL):m_data(data),m_pNext(next){}
};
Node* FindKthNodeToTail(Node* pHead,const int k)
{
if(!pHead || k <= 0)
return NULL;
Node* pFirstNode = pHead;
Node* pSecondNode = pHead;
for(int index = 0; index < k-1; ++index)
{
if(NULL == pFirstNode->m_pNext)//防止k大于链表长度
return NULL;
pFirstNode = pFirstNode->m_pNext;
}
while(pFirstNode->m_pNext)
{
pFirstNode = pFirstNode->m_pNext;
pSecondNode = pSecondNode->m_pNext;
}
return pSecondNode;
}