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

单链表反转问题

时间:2016-11-04 23:39:53      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:反转   区间   中间   为知笔记   des   public   tty   tween   检查   

单链表反转问题

基本问题

如何将单链表反转?

算法实现

  1. /**
  2. *
  3. * Description: 单链表反转.
  4. *
  5. * @param head
  6. * @return ListNode
  7. */
  8. public static ListNode reverseList(ListNode head) {
  9. if (head == null) {
  10. return head;
  11. }
  12. ListNode prev = null;
  13. ListNode current = head;
  14. ListNode next = null;
  15. while (current != null) {
  16. next = current.next;
  17. current.next = prev;
  18. prev = current;
  19. current = next;
  20. }
  21. head = prev;
  22. return head;
  23. }

进阶问题

如何 将单链表在指定区间内进行反转?

问题分析

这个问题是上面问题的一个变形,难度也加大了不少,主要的难点之处就在于对边界条件的检查。
实现思路,主要就是按照给定的区间得到需要整体反转的一个子链表然后进行反转,最后就是把链表按正确的顺序拼接在一起。

算法实现

  1. /**
  2. *
  3. * Description: 单链表反转,反转指定区间内的节点.
  4. *
  5. * @param head
  6. * @param m
  7. * @param n
  8. * @return ListNode
  9. */
  10. public static ListNode reverseBetween(ListNode head, int m, int n) {
  11. // 合法性检测
  12. if (head == null || m >= n || m < 1 || n < 1) {
  13. return head;
  14. }
  15. /**
  16. * 将链表按[m,n]区间分成三段.
  17. *
  18. * first,second,third分别为每一段的头节点(注意,m=1也就是first与second相等的情况的处理)
  19. * first-->firstTail
  20. * second
  21. * third
  22. */
  23. ListNode first = head;
  24. ListNode firstTail = first;
  25. ListNode second = first;
  26. ListNode third = first;
  27. ListNode current = first;
  28. int i = 0;
  29. while (current != null) {
  30. i++;
  31. if (i == m - 1) {
  32. firstTail = current;
  33. }
  34. if (i == m) {
  35. second = current;
  36. }
  37. if (i == n) {
  38. third = current.next;
  39. break;
  40. }
  41. current = current.next;
  42. }
  43. // 进行中间second段的reverse
  44. current = second;
  45. ListNode prev = third;
  46. ListNode next = null;
  47. while (current != third) {
  48. next = current.next;
  49. current.next = prev;
  50. prev = current;
  51. current = next;
  52. }
  53. if (m == 1) {
  54. first = prev;
  55. } else {
  56. firstTail.next = prev;
  57. }
  58. return first;
  59. }




单链表反转问题

标签:反转   区间   中间   为知笔记   des   public   tty   tween   检查   

原文地址:http://www.cnblogs.com/VioletLove/p/21f48cc7b0069f3c9924be38a9e52b55.html

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