LeetCode 数据结构与算法之反转链表

简介: LeetCode 数据结构与算法之反转链表

题目


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


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


题解


解题分析


解题思路


  • 迭代的方式处理


  1. 假设链表数据为 1->2->3->end, 我们需要把它修改为 end->3->2-1


  1. 在遍历的时候,将当前的 next 指针修改为指向前一个节点。由于节点没有引用前一个节点,必须事先存储前一个节点。在修改引用之前,还需要存储后一个节点,最后执行完成后返回新的头节点。


  1. 需要经历一轮循环才能完成反转。


复杂度


时间复杂度 O(N)


空间复杂度 O(1)


解题代码


题解代码如下(代码中有详细的注释说明):


/**
 * 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 prev = null ;
        ListNode curr = head;
        // 直接迭代反转
        while(curr != null) {
            ListNode next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
}


提交后反馈结果(由于该题目没有进行优化,性能一般):


image.png


  • 另外一种解法(递归), 核心代码就是 ead.next.next = head


class Solution {
    public ListNode reverseList(ListNode head) {
        // 如果头为空,或者只有一个节点
        if (head == null || head.next == null) {
            // 递归出口
            return head;
        }
        // 递归调用
        ListNode newHead = reverseList(head.next);
        // 这里很难理解本质就是将
        // 1->2->end 转换为 end->2->1
        head.next.next = head;
        // 防止出现环
        head.next = null;
        return newHead;
    }
}


参考信息



相关文章
|
6天前
|
Java
力扣经典150题第五十八题:合并两个有序链表
力扣经典150题第五十八题:合并两个有序链表
10 2
|
6天前
|
Java
力扣经典150题第六十题:反转链表 II
力扣经典150题第六十题:反转链表 II
7 1
|
6天前
|
存储 Java
力扣经典150题第五十九题: 随机链表的复制
力扣经典150题第五十九题: 随机链表的复制
6 1
|
6天前
|
Java 索引
力扣经典150题第五十六题:环形链表
力扣经典150题第五十六题:环形链表
6 0
|
11天前
|
算法 Java
Java数据结构与算法:双向链表
Java数据结构与算法:双向链表
|
11天前
|
算法 Java
Java数据结构与算法:循环链表
Java数据结构与算法:循环链表
|
12天前
|
算法
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
|
12天前
|
算法
【数据结构与算法 刷题系列】判断链表是否有环(图文详解)
【数据结构与算法 刷题系列】判断链表是否有环(图文详解)
|
2天前
|
机器学习/深度学习 算法 调度
Matlab|基于改进鲸鱼优化算法的微网系统能量优化管理matlab-源码
基于改进鲸鱼优化算法的微网系统能量管理源码实现,结合LSTM预测可再生能源和负荷,优化微网运行成本与固定成本。方法应用于冷热电联供微网,结果显示经济成本平均降低4.03%,提高经济效益。代码包括数据分段、LSTM网络定义及训练,最终展示了一系列运行结果图表。
|
7天前
|
算法 安全 数据库
基于结点电压法的配电网状态估计算法matlab仿真
**摘要** 该程序实现了基于结点电压法的配电网状态估计算法,旨在提升数据的准确性和可靠性。在MATLAB2022a中运行,显示了状态估计过程中的电压和相位估计值,以及误差随迭代变化的图表。算法通过迭代计算雅可比矩阵,结合基尔霍夫定律解决线性方程组,估算网络节点电压。状态估计过程中应用了高斯-牛顿或莱文贝格-马夸尔特法,处理量测数据并考虑约束条件,以提高估计精度。程序结果以图形形式展示电压幅值和角度估计的比较,以及估计误差的演变,体现了算法在处理配电网状态估计问题的有效性。