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

坚持刷题|反转链表

文章目录

  • 题目
  • 思考
  • 实现
    • 1. 迭代方式实现链表翻转
    • 2. 递归方式实现链表翻转

Hello,大家好,我是阿月。坚持刷题,老年痴呆追不上我,今天继续链表:反转链表

题目

LCR 024. 反转链表
在这里插入图片描述

思考

翻转链表是一个常见的算法问题,通常用于练习基本的数据结构操作

实现

在 Java 中可以通过迭代和递归两种方式来实现链表的翻转

1. 迭代方式实现链表翻转

  • 使用三个指针prevcurrnextTemp来逐步翻转链表。
    • prev初始化为null,表示新链表的末尾。
    • curr从头节点开始,逐步遍历整个链表。
    • 在遍历过程中,将当前节点的next指向前一个节点,并移动prevcurr到下一个节点。
class ListNode {int val;ListNode next;ListNode(int x) { val = x; }
}public class ReverseLinkedList {public static ListNode reverseList(ListNode head) {ListNode prev = null;ListNode curr = head;while (curr != null) {ListNode nextTemp = curr.next; // 保存下一个节点curr.next = prev; // 当前节点的next指向前一个节点prev = curr; // 前一个节点移动到当前节点curr = nextTemp; // 当前节点移动到下一个节点}return prev; // 返回新的头节点}public static void main(String[] args) {// 构建测试链表:1 -> 2 -> 3 -> 4 -> 5ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);head.next.next.next = new ListNode(4);head.next.next.next.next = new ListNode(5);// 翻转链表ListNode reversedHead = reverseList(head);// 打印翻转后的链表ListNode current = reversedHead;while (current != null) {System.out.print(current.val + " ");current = current.next;}}
}

2. 递归方式实现链表翻转

  • 递归地处理链表的剩余部分,直到到达最后一个节点。
  • 在回溯过程中,翻转当前节点和其前一个节点的连接。
  • 最终返回新的头节点。
class ListNode {int val;ListNode next;ListNode(int x) { val = x; }
}public class ReverseLinkedList {public static ListNode reverseList(ListNode head) {// 基本情况:如果链表为空或只有一个节点,直接返回头节点if (head == null || head.next == null) {return head;}// 递归翻转剩余的链表ListNode p = reverseList(head.next);// 当前节点的下一个节点指向当前节点head.next.next = head;head.next = null;return p; // 返回新的头节点}public static void main(String[] args) {// 构建测试链表:1 -> 2 -> 3 -> 4 -> 5ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);head.next.next.next = new ListNode(4);head.next.next.next.next = new ListNode(5);// 翻转链表ListNode reversedHead = reverseList(head);// 打印翻转后的链表ListNode current = reversedHead;while (current != null) {System.out.print(current.val + " ");current = current.next;}}
}

这两种方法在不同的场景下都有其优点和适用性。迭代方法通常更容易理解和实现,而递归方法则更具递归思想的优美性。

相关文章:

  • 专业技能篇--算法
  • Es 索引查询排序分析
  • Cocos Creator,Youtube 小游戏!
  • C++ Primer 学习 -- Day 2
  • 麒麟系统mate_indicators进程占用内存资源高
  • c++的多态,继承,抽象类,虚函数表,虚函数等题目+分析
  • 5分钟了解单元测试
  • BUU CODE REVIEW 11 代码审计之反序列化知识
  • 【Python】类和对象的深入解析
  • C语言程序设计-11 结构体与共用体
  • (2024最新)CentOS 7上在线安装MySQL 5.7|喂饭级教程
  • Nginx基础理论
  • 智能温室大棚在无土栽培中的应用
  • MySQL:创建账户及修改密码
  • 在k8s中部署Elasticsearch高可用集群详细教程
  • 收藏网友的 源程序下载网
  • Angular 响应式表单 基础例子
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • DataBase in Android
  • HashMap剖析之内部结构
  • Java IO学习笔记一
  • tweak 支持第三方库
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • UI设计初学者应该如何入门?
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​VRRP 虚拟路由冗余协议(华为)
  • ​业务双活的数据切换思路设计(下)
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)Linux——Linux常用指令
  • (四)opengl函数加载和错误处理
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)Scala的“=”符号简介
  • (转载)从 Java 代码到 Java 堆
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @Bean注解详解
  • [ C++ ] 继承
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [BZOJ1053][HAOI2007]反素数ant
  • [C++] vector对比list deque的引出
  • [C++]:for循环for(int num : nums)
  • [CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - 语言模型篇(4)
  • [CodeForces-759D]Bacterial Melee
  • [CP_AUTOSAR]_系统服务_DEM模块(一)功能及模块间依赖关系介绍
  • [CSS] - 修正IE6不支持position:fixed的bug
  • [ERR] 1273 - Unknown collation: ‘utf8mb4_0900_ai_ci‘(已解决)