题目描述

题解
/**
* Definition for singly-linked list.
* public class ListNode {
* int val
* ListNode next
* ListNode() {}
* ListNode(int val) { this.val = val
* ListNode(int val, ListNode next) { this.val = val
* }
*/
// 三指针法
// 初始化pre mid cur三链表指针,pre在左,mid在中,cur在右。
// 方法过程如下:
// 先进行翻转后链表尾结点的初始化,链表尾最后一个结点要指向null:
// pre mid cur
// null 5 -> 4 -> 3 -> 2 -> 1 -> null
// pre mid cur
// null <- 5 4 -> 3 -> 2 -> 1 -> null
// 然后开始while循环,pre mid cur三指针右移,然后mid指向pre实现反向:
// pre mid cur
// null <- 5 4 -> 3 -> 2 -> 1 -> null
// pre mid cur
// null <- 5 <- 4 3 -> 2 -> 1 -> null
// pre mid cur
// null <- 5 <- 4 3 -> 2 -> 1 -> null
// pre mid cur
// null <- 5 <- 4 <- 3 2 -> 1 -> null
// pre mid cur
// null <- 5 <- 4 <- 3 2 -> 1 -> null
// pre mid cur
// null <- 5 <- 4 <- 3 <- 2 1 -> null
// pre mid cur
// null <- 5 <- 4 <- 3 <- 2 1 -> null
// pre mid cur
// null <- 5 <- 4 <- 3 <- 2 <- 1 null
// while的最后一步是将移动后的mid的next指向pre,然后检测到cur已经是null,
// 循环结束,返回翻转后的新头结点mid即可。
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:38 MB, 在所有 Java 提交中击败了93.48%的用户
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null)
return head
ListNode pre = head
ListNode mid = head.next
ListNode cur = head.next.next
pre.next = null
mid.next = pre
while (cur != null) {
pre = mid
mid = cur
cur = cur.next
mid.next = pre
}
return mid
}
}
// 双指针
// 三指针可以包装成双指针,但是本质还是三指针,翻转无法单靠两个指针来完成
// 这里pre取代了三指针法中mid的位置,temp取代了三指针法中pre的位置。
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:38.4 MB, 在所有 Java 提交中击败了25.66%的用户
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null)
return head
ListNode pre = head
ListNode cur = head.next
pre.next = null
while (cur != null) {
ListNode temp = pre
pre = cur
cur = cur.next
pre.next = temp
}
return pre
}
}
class Solution {
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode cur = reverseList(head.next);
head.next.next = head;
head.next = null;
return cur;
}
}