反转链表的两种方法

反转链表的两种方法

题目介绍

题目链接 206. 反转链表

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

效果图如下所示

反转链表的两种方法_第1张图片

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

解法一:迭代方法

解题思路:

通过使用头插法和哑元节点的结合来达到翻转链表的目标。

public ListNode reverse(ListNode head){
    if (head == null) {
        return head;
    }
    // 哑元节点用于指向反转后的链表
    ListNode newHead = new ListNode(0);
    while (head != null) {
        // 1.先把后一个节点缓存
        ListNode nextNode = head.next;
        // 2.使用头插法
        head.next = newHead.next;
        newHead.next = head;
        // 3.继续遍历下一个链表节点
        head = nextNode;
    }
    return newHead.next;
}

解法二:递归方法

解题思路:

使用递归方法,调用下一个节点,直到后面的节点已经被逆序,递归出口为当前节点为null,或者当前节点的下一个节点为null。

public ListNode reverse(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }
    ListNode newHead = reverse(head.next);
    head.next.next = head;
    head.next = null;
    return newHead;
}

你可能感兴趣的:(LeetCode,数据结构,java,数据结构,算法,java,链表,leetcode)