链表中倒数第k个节点

    题目:输入一个链表,输出该链表中倒数第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 }

 

posted @ 2016-08-17 16:41  没长大的书生  阅读(195)  评论(0编辑  收藏  举报