LeetCode LCR 024. 反转链表

LCR 024. 反转链表

算法题地址:https://leetcode.cn/problems/UHnkqh/description/
给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。

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

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

示例 3:
输入:head = []
输出:[]

提示:
链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

解题

思路已用注释解释

package com.pippi.example.LCR;

/**
 *https://leetcode.cn/problems/UHnkqh/description/
 * 给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。
 */
public class P24_反转链表 {

    /**
     * 递归的做法
     * @param head
     * @return
     */
    public ListNode reverseList(ListNode head) {
        // 如果只有一个链表,head == Null 就可以拦住了
        if (head == null || head.next == null) return head;
        // 例链表:1 2 3 4 5 null
        //传到最底,会拿到最后一个元素 4.next 也就是5,因为下次递归进去5.next是空,拦截返回
        ListNode newListNode = reverseList(head.next);
        
        // 第一次:此时head是4,   4.next.next  相当于设置 5.next = 4
        // 第二次:head是3,自行往后推导
        head.next.next = head;
        // 4.next = null,将4对5的指向断掉,成了  5 4 null,
        head.next = null;

        // 返回5,做首节点链表
        return newListNode;
    }


    /**
     * 非递归式的反转链表  1 2 3 4 5
     */
    public ListNode reverseListNode(ListNode head){
        if (head == null || head.next == null) return head;

        ListNode newHead = null;
        while (head != null){
            //先将首节点的下一个节点 暂存
            ListNode temp = head.next;
            // 指向上一个节点,第一次进来newHead是空,第二次循环就将1串尾部了
            head.next = newHead;
            // 指针往后挪,现在是1
            newHead = head;
            // 循环条件指针也往后挪,拿2
            head = temp;
        }

        return newHead;
    }
}

我所练习所有算法题源码(持续更新):https://gitee.com/Pippixx/LeetCodeExample

你可能感兴趣的:(leetcode简单算法题,leetcode,链表,算法)