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

LeetCode - 206. 反转链表

目录

题目

反转链表的详细步骤

反转链表递归实现的详细过程

递归调用栈展开过程

递归调用栈回溯过程

图示演变过程

读者可能出现的错误写法

正确写法


题目

206. 反转链表 - 力扣(LeetCode)

反转链表的详细步骤

递归方法步骤

处理边界情况:

  • 如果链表为空(head == nullptr),直接返回nullptr
  • 如果链表只有一个节点(head->next == nullptr),直接返回head

递归反转子链表:

  • 调用reverseList(head->next)递归处理除了头节点外的其余部分
  • 这会返回反转后子链表的新头节点(newHead),即原链表的最后一个节点

调整当前节点的连接:

  • 将head的下一个节点的next指向head:head->next->next = head
  • 这一步将当前节点接到反转后子链表的末尾

断开原有连接:

  • 将head的next设为nullptr:head->next = nullptr
  • 这样防止链表中形成环

返回新头节点:

  • 返回在递归中获得的新头节点newHead

反转链表递归实现的详细过程

假设我们有链表:1 -> 2 -> 3 -> 4 -> 5 -> nullptr

递归调用栈展开过程

调用 reverseList(1)

  • 1->next 不为 nullptr,继续递归
  • 调用 reverseList(2)

调用 reverseList(2)

  • 2->next 不为 nullptr,继续递归
  • 调用 reverseList(3)

调用 reverseList(3)

  • 3->next 不为 nullptr,继续递归
  • 调用 reverseList(4)

调用 reverseList(4)

  • 4->next 不为 nullptr,继续递归
  • 调用 reverseList(5)

调用 reverseList(5)

  • 5->next 为 nullptr,这是基本情况
  • 返回 5 作为新的头节点

递归调用栈回溯过程

返回到 reverseList(4)

  • newHead = 5
  • 执行 4->next->next = 4 (即 5->next = 4)
  • 执行 4->next = nullptr
  • 此时链表变为:5 -> 4 -> nullptr,3 -> 4 (断开)
  • 返回 newHead = 5

返回到 reverseList(3)

  • newHead = 5
  • 执行 3->next->next = 3 (即 4->next = 3)
  • 执行 3->next = nullptr
  • 此时链表变为:5 -> 4 -> 3 -> nullptr,2 -> 3 (断开)
  • 返回 newHead = 5

返回到 reverseList(2)

  • newHead = 5
  • 执行 2->next->next = 2 (即 3->next = 2)
  • 执行 2->next = nullptr
  • 此时链表变为:5 -> 4 -> 3 -> 2 -> nullptr,1 -> 2 (断开)
  • 返回 newHead = 5

返回到 reverseList(1)

  • newHead = 5
  • 执行 1->next->next = 1 (即 2->next = 1)
  • 执行 1->next = nullptr
  • 此时链表变为:5 -> 4 -> 3 -> 2 -> 1 -> nullptr
  • 返回 newHead = 5

最终结果

  • 返回 newHead = 5,链表已完全反转

图示演变过程

初始:    1 -> 2 -> 3 -> 4 -> 5 -> nullptr
步骤6:   1 -> 2 -> 3 -> 4    5 -> 4 -> nullptr
步骤7:   1 -> 2 -> 3         5 -> 4 -> 3 -> nullptr
步骤8:   1 -> 2              5 -> 4 -> 3 -> 2 -> nullptr
步骤9:   1                   5 -> 4 -> 3 -> 2 -> 1 -> nullptr

读者可能出现的错误写法

class Solution {
public:ListNode* reverseList(ListNode* head) {if(!head->next){return;}reverseList(ListNode* head->next);head->next->next = head;head -> next = nullptr;}
};

返回值缺失:

  • 在第一个if条件中,你使用了return;而没有返回值,但函数需要返回ListNode*
  • 递归函数没有返回反转后的新头节点

语法错误:

  • reverseList(ListNode* head->next);中不应该再次声明ListNode*类型

边界条件处理不完整:

  • 没有处理head为nullptr的情况

正确写法

class Solution {
public:ListNode* reverseList(ListNode* head) {if(head == nullptr){return nullptr;}if(head->next == nullptr){return head;}ListNode* newHead = reverseList(head->next);head->next->next = head;head -> next = nullptr;return newHead;}
};

相关文章:

  • 软件性能之CPU
  • leetcode hot100刷题日记——30.两数之和
  • 设计模式——单例设计模式(创建型)
  • 【MFC】如何设置让exe的控制台不会跟着exe退出而退出
  • 【KWDB 创作者计划】_探秘浪潮KWDB数据库:从时间索引到前沿技术
  • C++ 重载(Overload)、重写(Override)、隐藏(Hiding) 的区别
  • 【Hot 100】121. 买卖股票的最佳时机
  • acwing刷题
  • 江科大IIC读取MPU6050hal库实现
  • 在Windows本地部署Dify详细操作
  • Linux入门(十二)服务管理
  • 建筑兔零基础人工智能自学记录101|Transformer(1)-14
  • LG P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III Solution
  • 若依框架-定制化服务搭建
  • 信息安全之什么是公钥密码
  • 大模型应用开发之预训练
  • vue3的watch用法
  • 产品规格书写作结构、规范(编写指南)
  • 力扣热题100之翻转二叉树
  • 26考研——文件管理_文件目录(4)
  • 一般网站建设费用预算/网络推广seo是什么
  • 遵义网站建设哪家好?/怎么做好公司官网推广
  • 濮阳团购网站建设/关键词排名关键词快速排名
  • 网站域名去哪买/seo图片优化的方法
  • 网站建设的工期拖延如何解决/如何通过网络营销自己
  • 提供网站建设服务的网站/网络推广项目计划书