day4-反转链表

反转链表

力扣题目链接

题目描述

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

思路

面试常考的题型,这里带来两种做法,一种双指针,一种迭代法。

双指针法

第一次看到题目时,我第一时间想到的是,先从第一个结点找到最后一个,然后再依次翻转。但是这样的时间复杂度就是O(2n)了。

为什么不能第一次遍历的时候就处理好所有翻转呢?定义两个指针

  • pre:指向当前结点的前一个结点
  • cur:指向当前结点

这样这需要一对对处理即可,难点在于如何进行结点的更替。

代码如下:

c 复制代码
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
       ListNode* tmp;
       ListNode* cur = head;
       ListNode* pre = nullptr; //头节点的pre指向null

       while(cur){
            tmp = cur->next; //保存cur的下一个结点,因为下一步要修改
            cur->next = pre;
            //update
            pre = cur; // 更新结点,从后往前更新
            cur = tmp;
       }
       return pre;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

迭代法

迭代法的本质思路其实跟双指针是一样的,不同点在于使用了n栈的空间。

如果可以理解双指针,理解迭代法应该是更加轻松才对。

代码如下:

c 复制代码
 ListNode* reverseList(ListNode* head) {
        return reverse(nullptr,head);
    }
    ListNode* reverse(ListNode* pre, ListNode* cur)
    {
        if(cur == nullptr)return pre; //终止条件
        ListNode* tmp = cur->next;
        cur->next = pre;
        return reverse(cur,tmp);
    }
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
相关推荐
彧azz1 小时前
图的最短路径:Dijkstra与Floyd算法
数据结构·笔记·学习
智购科技自动售卖机厂家1 小时前
设备一到夏天就频繁跳闸,从启动电流追到压缩机电容~YH
数据结构·人工智能·python·eclipse
Logic1012 小时前
C语言/数据结构动态规划题解:Kadane算法求最大子数组和——O(n)时间O(1)空间
c语言·数据结构·动态规划·贪心·时间复杂度·算法题·最大子数组和
鹿角片ljp2 小时前
从 Kimi Cyber Reasoning 学习网络安全推理数据集:从 Reasoning SFT 到安全 Agent 数据设计
数据结构·算法
Logic1013 小时前
C语言/数据结构位运算题解:异或XOR找出数据表中的“独特编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
wabs6664 小时前
关于二叉树【力扣100.相同的树的思考】
数据结构·c++·算法·leetcode·二叉树·递归法
qianyanwanyv6 小时前
数据结构概念
数据结构
Logic1016 小时前
C语言/数据结构位运算题解:异或XOR找出英雄升级系统中的“独特经验值“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
梦帮科技15 小时前
AI 音乐产品的发布工程:验证门、数据发布、回滚与生产运维纪律
数据结构·数据库·架构·node.js·音视频·动态规划·推荐算法