力扣题解 206th 反转链表

206th 反转链表

  • 三指针法/迭代

    • 原理:把后一个元素的next指针指向前一个元素。
    • 为什么要引入三个指针:
      • Previous指针:用来记录前一个元素,mid指针将指向它。
      • Mid指针:用来记录当前需要修改next指针的那个元素,在previous指针的前一位,previous指针在修改完毕后将指向它。
      • Next指针:指向链表剩余部分的第一个元素,mid指针在修改完毕后将指向它,在mid指针的前一位。
    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode reverseList(ListNode head) {
            ListNode previous = null;
            ListNode mid = head;
    
            while(mid != null) {
                ListNode next = mid.next;
                mid.next = previous;
                previous = mid;
                mid = next;
            }
    
            return previous;
        }
    }
    
  • 递归

    递归的写法根据三指针迭代法修改而来,递归循环的变量是三指针中的next指针(递归看起来是正着走过去的与遍历相同,但递归是反过来时才开始执行的,我们可以利用此特性实现链表的间歇性反转),其他两个指针被head.next.next = head抵消。

    /**
     * Definition for singly-linked list.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int x) { val = x; }
     * }
     */
    class Solution {
        public ListNode reverseList(ListNode head) {
            if(head == null || head.next == null) return head;
            ListNode p = reverseList(head.next);
    
            head.next.next = head;
            head.next = null;
    
            return p;
        }
    }
    
原文地址:https://www.cnblogs.com/fromneptune/p/13274688.html