单链表倒置(顺序与递归)

前端之家收集整理的这篇文章主要介绍了单链表倒置(顺序与递归)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

单链表倒置,给你一个头指针,用递归与非递归的方法分别实现;

分析见代码

代码如下:

  1. // [9/30/2013 qingezha] 链表倒置 循环与递归形式
  2. // 一般形式,1—>2->3->4 现在1<-2<-3<-4 那么改变1的next的时候需要保存指向2的指针,然后同理处理2
  3. // 需要保存的,用直译(见词知意)的表达出来比如:pre前面,next后面,cur当前,然后循环后赋新值
  4. LinkPtrs reverse_link(LinkPtrs root) //头指针指向的是第一个元素
  5. {
  6. if(root == NULL)
  7. return NULL;
  8. LinkPtrs nextp = root->next; //第一个结点
  9. LinkPtrs pre = root; //保留前端
  10. LinkPtrs temp = NULL;
  11. LinkPtrs reverseHead = NULL;
  12. pre -> next = NULL;
  13. while(nextp->next)
  14. {
  15. temp = nextp -> next; //先要保存下一个指针
  16. nextp -> next = pre;
  17. pre = nextp;
  18. nextp = temp;
  19. }
  20. nextp -> next = pre;
  21. reverseHead = nextp;
  22. return reverseHead;
  23. }
  24. //链表倒置,切记 方法很巧!!!!!!!!!!!!!!!!!!
  25. LinkPtrs reverse_link_recursive(LinkPtrs root)
  26. {
  27. if(root == NULL)
  28. return NULL;
  29. LinkPtrs cur,temp,revers_head;
  30. if(root->next == NULL)
  31. return root; //链表如果只有一个结点,那么直接返回第一个
  32. else
  33. {
  34. cur = root;
  35. temp = cur -> next; //temp 为2->3->4的头指针
  36. //可以认为后面的都已经倒过来了,且认为revers_head 为倒过来的链表的头指针
  37. //这样理解就容易多了
  38. revers_head = reverse_link_recursive(temp);
  39. temp -> next = cur;
  40. cur -> next = NULL;
  41. }
  42. return revers_head;
  43. }

猜你在找的设计模式相关文章