zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【leetcode】日积月累,每日一题--206. 反转链表(DayDayUp 13)

LeetCode链表 -- 每日 13 反转 DayDayUp 日积月累
2023-09-11 14:20:19 时间

前 言 : \textcolor{Green}{前言:} 今天汇报了前几天学的机器学习中的一块内容,被老师给问懵了,感受了语言之美(好话啊)比如说:查准率,用病人的例子来讲就是查出有病的有多少是真正有病的。道理很简单,但就是表达不出来。

题目来源

等 级 : 简 单 \textcolor{OrangeRed}{等级:简单}

一、题目

给你单链表的头节点 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

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

二、代码及思路

思路:
定义一个前指针节点,一个当前指针节点,以及一个临时结点。循环判断当前结点是否为空,不为空则将这个结点存储,当前结点指向它前面的结点,然后当前的结点和前指针结点后移,

弟弟的代码:(双指针)

/**
 * 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; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode after = head;
        ListNode temp = null;
        while(after != null){
            temp = after.next;
            after.next = pre;
            pre = after;
            after = temp;
        }
        return pre;
    }
}

看到大佬的一个递归做法

// 递归 
class Solution {
    public ListNode reverseList(ListNode head) {
        return reverse(null, head);
    }

    private ListNode reverse(ListNode prev, ListNode cur) {
        if (cur == null) {
            return prev;
        }
        ListNode temp = null;
        temp = cur.next;// 先保存下一个节点
        cur.next = prev;// 反转
        // 更新prev、cur位置
        prev = cur;
        cur = temp;
        return reverse(prev, cur);
    }
}