力扣题解 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; } }