链表的巧解

直观地想,如果想得到倒数第k 个节点,那么从后面往前数k个啰?这个不行,单向链表
是行不通的,那么也可以这样,设有n个节点,那么向前往后数n-k+1个吧。但是这种方法
要两次遍历链表,第一次是获得链表节点的个数n.第二次才找到倒数第k个节点。
比较巧的方法是:
        设两个指针,一个指各头,另一个与前一个指针相隔k-1个节点,则当后面那个指针
指向尾的时候,前面那个就指向了倒数第k个节点了。


注意代码的鲁棒性:

  1. #ifndef COUNT_BACKWARD_H
  2. #define COUNT_BACKWARD_H
  3. #include<iostream>
  4. struct ListNode
  5. {
  6. int m_value;
  7. struct ListNode *m_pNext;
  8. };
  9. ListNode *findBackward_k(ListNode **head,int k_backward){
  10. if(head==NULL||*head==NULL||k_backward==0){
  11. return NULL ;
  12. }
  13. if((*head)->m_pNext==NULL&&k_backward==1){
  14. return *head;
  15. }
  16. ListNode *m_phead=*head;
  17. ListNode *pre_kbackward=m_phead;
  18. ListNode *m_pend=m_phead-1;
  19. int count_dis=k_backward;
  20. while(m_pend->m_pNext!=NULL){
  21. if(count_dis>0){
  22. m_pend=m_pend->m_pNext;
  23. count_dis--;
  24. continue;
  25. }
  26. pre_kbackward=pre_kbackward->m_pNext;
  27. m_pend=m_pend->m_pNext;
  28. }
  29. if(count_dis!=0){
  30. throw("invalid input value");
  31. }
  32. return pre_kbackward;
  33. }
  34. #endif

发散思维:















posted @ 2015-07-17 19:29  yml435  阅读(167)  评论(0编辑  收藏  举报