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

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

反转链表

    • 一、题目
    • 二、代码及思路

题目来源

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

一、题目

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

示例 1:
【leetcode】日积月累,每日一题--206. 反转链表(DayDayUp 13)_第1张图片

输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2:
【leetcode】日积月累,每日一题--206. 反转链表(DayDayUp 13)_第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);
    }
}

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