首页 > 代码库 > 单链表反转问题

单链表反转问题

单链表反转问题

基本问题

如何将单链表反转?

算法实现

  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. }


来自为知笔记(Wiz)


单链表反转问题