【Leetcode】206. 反转链表

106 阅读2分钟

题目描述

在这里插入图片描述

// 206. 反转链表


// 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

题解

/**
 * 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; this.next = next; }
 * }
 */

// 三指针法
// 初始化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;
    }
}
// 递归法
// 这里可以看 https://leetcode-cn.com/problems/reverse-linked-list/solution/dong-hua-yan-shi-206-fan-zhuan-lian-biao-by-user74/
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:38.5 MB, 在所有 Java 提交中击败20.88%的用户
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;
    }
}