当前位置: 首页 > news >正文

【数据结构与算法】206.反转链表(LeetCode)

反转链表

问题描述

给定单链表的头节点 head,要求反转链表并返回反转后的链表头节点。

题目传送门

在这里插入图片描述

思路一:创建新链表头插法

核心思路:创建新链表,将原链表中的节点拿来头插

算法步骤

  1. 初始化新链表头节点 newheadNULL
  2. 使用指针 pcur 遍历原链表
  3. 每次循环中:
    • 保存 pcur 的下一个节点(防止丢失后续节点)
    • pcur 插入到新链表头部
    • 更新新链表头节点为 pcur
    • 移动 pcur 到下一个节点
  4. pcurNULL 时,返回新链表头节点

如图:

在这里插入图片描述

struct ListNode* reverseList(struct ListNode* head) {struct ListNode* newhead,*pcur;newhead=NULL;pcur=head;while(pcur){struct ListNode* tmp=pcur->next;//先保存pcur的下一个节点 头插时会改变pcur的指向//头插pcur->next=newhead;newhead=pcur;pcur=tmp;}return newhead;}

复杂度分析

  • 时间复杂度:O(n),只需遍历链表一次
  • 空间复杂度:O(1),仅使用固定数量的指针变量

思路二:三个指针法

指针定义

  • n1:指向已反转部分的最后一个节点(初始为NULL)
  • n2:指向当前待反转节点(初始为头节点)
  • n3:指向下一个待反转节点(初始为头节点的下一个节点)

算法步骤

  1. 初始化三个指针:n1 = NULL, n2 = head
  2. 如果链表非空,则设置 n3 = head->next
  3. 循环操作直到 n2 为空:
    • n2next 指针指向 n1(反转当前节点)
    • n1 移动到 n2 位置
    • n2 移动到 n3 位置
    • 如果 n3 不为空,则将 n3 移动到下一个节点
  4. 返回 n1(即新链表的头节点)

如图

在这里插入图片描述
)

可以看到循环结束的条件是n2为空

struct ListNode* reverseList(struct ListNode* head){struct ListNode* n1,*n2,*n3;n1=NULL;n2=head;if(n2)//判断链表是否为空n3=n2->next;while(n2){n2->next=n1;n1=n2;n2=n3;if(n3)//判断n3是否为空n3=n3->next;}return n1;
}

注意事项

  1. 边界条件处理
    • 空链表:直接返回 NULL
    • 单节点链表:无需反转,直接返回头节点
  2. 指针移动顺序
    • 必须先更新 n1n2,再更新 n3
    • 更新 n3 前需要检查其是否为空,避免空指针异常

复杂度分析

  • 时间复杂度:O(n),只需遍历链表一次

  • 空间复杂度:O(1),仅使用固定数量的指针变量

    方法对比分析

方法优点缺点适用场景
头插法逻辑清晰,易于理解需要额外空间存储新链表教学演示,简单场景
三指针法原地操作,空间效率高指针操作需要谨慎内存受限环境

总结

反转链表是链表操作中的经典问题,2种方法各有特点:

  1. 头插法:直观易懂,适合初学者理解链表反转的基本原理

  2. 三指针法:空间效率最优,适合实际开发中的内存敏感场景

受限环境

http://www.lryc.cn/news/585577.html

相关文章:

  • 力扣-21.合并两个有序链表
  • 力扣-160.相交链表
  • MongoDB(一)
  • “28项评测23项SOTA——GLM-4.1V-9B-Thinking本地部署教程:10B级视觉语言模型的性能天花板!
  • 【SpringBoot】 整合MyBatis+Postgresql
  • 瀚高数据库提交数据后,是否需要COMMIT(APP)
  • 微信小程序核心知识点速览
  • Android simpleperf生成火焰图
  • 《数据库》MySQL备份回复
  • 神经网络的参数初始化
  • 鸿蒙app 开发中的Record<string,string>的用法和含义
  • Ubuntu 24.04上安装 Intelligent Pinyin 中文输入法
  • 模拟心电图采样数据
  • 【SpringAI】6.向量检索(redis)
  • 用FunctionCall实现文件解析(一):环境准备与基础知识
  • 如何使用Fail2Ban阻止SSH暴力破解
  • vue3+express联调接口时报“\“username\“ is required“问题
  • 获取华为开源3D引擎 (OpenHarmony),把引擎嵌入VUE中
  • Spring Boot中请求参数读取方式
  • AIC8800M40低功耗wifi在ARM-LINUX开发板上做OTA的调试经验
  • (六)复习(OutBox Message)
  • ParaCAD 笔记 png 图纸标注数据集
  • 设计模式(结构型)-适配器模式
  • jenkins部署springboot+Docker项目
  • 力扣网编程134题:加油站(双指针)
  • [实战]调频三角波和锯齿波信号生成(完整C代码)
  • leetcode-hot100(283.移动零)
  • 力扣面试150(29/100)
  • OA系统中的搜索功能方案:简单搜索vs高级搜索
  • SpringDataRedis入门