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

C++面试(9)-----反转链表

  • 操作系统:ubuntu22.04
  • IDE:Visual Studio Code
  • 编程语言:C++11

题目描述

输入一个链表,输出该链表反转之后的链表。例如:

输入: 1->2->3->4->5->NULL

输出: 5->4->3->2->1->NULL

解决方案

这个问题可以通过多种方法解决,包括递归法和迭代法。下面分别介绍这两种方法。

方法一:迭代法

使用三个指针来逐步反转链表中的每一个节点,直到遍历完整个链表。
代码实现(C++)

struct ListNode {int val;ListNode* next;ListNode( int x ) : val( x ), next( nullptr ) {}
};ListNode* reverseList( ListNode* head )
{ListNode* prev = nullptr;  // 前驱节点ListNode* curr = head;     // 当前处理的节点while ( curr != nullptr ){ListNode* nextTemp = curr->next;  // 暂存当前节点的下一个节点curr->next         = prev;        // 将当前节点指向前驱节点prev               = curr;        // 移动前驱节点到当前节点curr               = nextTemp;    // 移动到下一个待处理节点}return prev;  // 新的头节点是原链表的最后一个节点
}int main()
{ListNode* node1 = new ListNode(1);node1->next = new ListNode(2);node1->next->next = new ListNode(3);node1->next->next->next = new ListNode(4);node1->next->next->next->next = new ListNode(5);ListNode* res = reverseList(node1);ListNode *head = res;while(res != nullptr){std::cout<< res->val<<std::endl;res = res->next;}
}

输出:

5
4
3
2
1

方法二:递归法

递归地反转链表,对于每个节点,假设其后续节点已经被正确反转,然后调整当前节点的指向。

代码实现(C++)

struct ListNode {int val;ListNode* next;ListNode( int x ) : val( x ), next( nullptr ) {}
};
ListNode* reverseList( ListNode* head )
{// 基本情况:如果头节点为空或只有一个节点,则直接返回头节点if ( head == nullptr || head->next == nullptr ){return head;}// 递归调用,反转剩余链表ListNode* p = reverseList( head->next );// 反转当前节点与下一个节点之间的连接head->next->next = head;head->next       = nullptr;return p;  // 返回新的头节点
}int main()
{ListNode* node1 = new ListNode(1);node1->next = new ListNode(2);node1->next->next = new ListNode(3);node1->next->next->next = new ListNode(4);node1->next->next->next->next = new ListNode(5);ListNode* res = reverseList(node1);ListNode *head = res;while(res != nullptr){std::cout<< res->val<<std::endl;res = res->next;}
}

输出:

5
4
3
2
1
http://www.xdnf.cn/news/1023787.html

相关文章:

  • 2025年渗透测试面试题总结-字节跳动[实习]安全研发员(题目+回答)
  • CoLMDriver:基于LLM的协同自动驾驶
  • LangChain面试内容整理-知识点10:文本嵌入模型(Embeddings)使用
  • 如何安装使用qmt脚本跟单聚宽策略
  • C++四大默认成员函数:构造、析构、拷贝构造与赋值重载
  • 利用pycharm搭建模型步骤
  • Sqoop进阶之路:解锁数据迁移新姿势
  • 2025.6.12 【校内 NOI 训练赛】记录(集训队互测选做)
  • 使用OceanBase的Oblogminer进行日志挖掘的实践
  • Mysql 函数concat、concat_ws和group_concat
  • MySQL的对表对整库备份脚本
  • Elasticsearch 常用命令(未完成)
  • python中的文件操作处理:文本文件的处理、二进制文件的处理
  • 心之眼 豪华中文 免安 离线运行版
  • 大模型记忆相关(MemoryOs)
  • kafka Tool (Offset Explorer)使用SASL Plaintext进行身份验证
  • cinematic-gaussians
  • 【RAG+读代码】学术文档解析工具Nougat
  • DeepSeek 引领前端开发变革:AI 助力学习与工作新路径
  • 基于STM32手势识别智能家居系统
  • 抖音AI数字人对口型软件LatentSync最新版整合包,音频驱动口型讲话
  • echarts图封装 自动切换 大屏 swiper 切换里面放echarts图,注意不要开循环 否则出不来
  • 图像处理算法的学习笔记
  • SpringBoot的Web应用开发——Web缓存利器Redis的应用!
  • 【UEFI系列】PEI阶段讲解
  • 生产环境LVM存储降级方案
  • Python训练营---DAY53
  • Git 前后端 Java Vue 项目的 .gitignore 配置分享
  • Linux环境下安装和使用RAPIDS平台的cudf和cuml - pip 安装方法
  • java集合(八) ---- Vector 类