题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如一个链表有6个节点,从头节点开始它们的值一次是1,2,3,4,5,6。这个链表的倒数第三个节点是值为4的节点。
链表节点定义如下:
struct ListNode{
int m_nValue;
ListNode* m_pNext;
}
解析:有两种方法可以实现,一种是第一遍遍历链表,得到链表节点的个数n,之后再一次遍历,n-k+1节点即为倒数第k个节点,这种方法要先遍历一遍,复杂度高。第二种方法是用两个指针,移动两个指针,保证两个指针间隔为k,等到前面的指针遍历到链表的结尾时,后面指针所指即为倒数第k个节点。代码如下:
1 struct ListNode{ 2 int m_nValue; 3 ListNode* m_pNext; 4 }; 5 //注重代码的鲁棒性,pListHead为NULL的情况,k-1大于整个链表长度的情况都要考虑到 6 ListNode* FindKthToTail(ListNode* pListHead,int k){ 7 if(pListHead == NULL || k <= 0) 8 return NULL; 9 ListNode* pAhead = pListHead; 10 ListNode* pBehind = pListHead; 11 for(int i=1;i<=k-1;i++){ 12 if(pAhead->m_pNext == NULL) 13 return NULL; 14 pAhead = pAhead->m_pNext; 15 } 16 while(pAhead->m_pNext!=NULL){ 17 pAhead = pAhead->m_pNext; 18 pBehind = pBehind->m_pNext; 19 } 20 return pBehind; 21 }