Skip to content

链表翻转也是个经典问题,题目:单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

img

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

img

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

ListNode表示链表,leetcode题目中提供的

java
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;
    }
}

翻转链表分析

下面这张图能更好的理解翻转链表,核心是箭头的方向发生改变,设置3个变量:pre是前一个节点,cur是当前节点,next是下一个节点。将当前节点的next指向pre前一个节点,同时pre为下一轮循环做准备

翻转链表

方法1:非递归方式实现

java
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        while (cur != null) {
            ListNode next = cur.next;
            // 完成当前节点的反转
            cur.next = pre;
            // 为下一轮循环做准备
            pre = cur;
            cur = next;
        }
        return pre;
    }
}

方法二:递归方式实现

java
class Solution {
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        // 理解方式:递归调用类似于栈,这样除了head之外,其他链表指向都发送了翻转,
        // 例如1->2->3->4->5递归调用后变成2<-3<-4<-5
        ListNode rev = reverseList(head.next);
        // 准确来说是这样的 1->2 null<-2<-3<-4<-5,因此下面俩句来解决head指向问题
        head.next.next = head;
        head.next = null;
        return rev;
    }
}