码迷,mamicode.com
首页 > 其他好文 > 详细

链表的巧解

时间:2015-07-17 20:55:47      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:

技术分享
直观地想,如果想得到倒数第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

发散思维:
技术分享
技术分享













链表的巧解

标签:

原文地址:http://www.cnblogs.com/yml435/p/4655491.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!