反转一个单链表。

    1. 输入: 1->2->3->4->5
    2. 输出: 5->4->3->2->1

    解法1:迭代,重复某一过程,每一次处理结果作为下一次处理的初始值,这些初始值类似于状态、每
    次处理都会改变状态、直至到达最终状态

    从前往后遍历链表,将当前节点的next指向上一个节点,因此需要一个变量存储上一个节点prev,当前
    节点处理完需要寻找下一个节点,因此需要一个变量保存当前节点curr,处理完后要将当前节点赋值给
    prev,并将next指针赋值给curr,因此需要一个变量提前保存下一个节点的指针next
    image.png
    1、将下一个节点指针保存到next变量 next = curr.next
    2、将下一个节点的指针指向prev,curr.next = prev
    3、准备处理下一个节点,将curr赋值给prev
    4、将下一个节点赋值为curr,处理一个节点

    解法2:递归:以相似的方法重复,类似于树结构,先从根节点找到叶子节点,从叶子节点开始遍历
    大的问题(整个链表反转)拆成性质相同的小问题(两个元素反转)curr.next.next = curr
    将所有的小问题解决,大问题即解决image.png
    只需每个元素都执行curr.next.next = curr,curr.next = null两个步骤即可
    为了保证链不断,必须从最后一个元素开始

    1. public class ReverseList {
    2. public static void main(String[] args) {
    3. ListNode node5 = new ListNode(5, null);
    4. ListNode node4 = new ListNode(4, node5);
    5. ListNode node3 = new ListNode(3, node4);
    6. ListNode node2 = new ListNode(2, node3);
    7. ListNode node1 = new ListNode(1, node2);
    8. // 1、迭代
    9. //ListNode prev1 = iterate(node1);
    10. // 2、递归
    11. ListNode prev2 = recursion(node1);
    12. System.out.println(prev2);
    13. }
    14. // 递归
    15. private static ListNode recursion(ListNode head) {
    16. if (head == null || head.next == null) {
    17. return head;
    18. }
    19. ListNode new_head = recursion(head.next);
    20. head.next.next = head;
    21. head.next = null;
    22. return new_head;
    23. }
    24. // 迭代
    25. public static ListNode iterate(ListNode head) {
    26. ListNode prev = null,next;
    27. ListNode curr = head;
    28. while (curr != null) {
    29. next = curr.next;
    30. curr.next = prev;
    31. prev = curr;
    32. curr = next;
    33. }
    34. return prev;
    35. }
    36. private static class ListNode {
    37. int val;
    38. ListNode next;
    39. public ListNode(int val, ListNode next) {
    40. this.val = val;
    41. this.next = next;
    42. }
    43. }
    44. }