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

正能量晚上看的网站2021网站优化客户报表

正能量晚上看的网站2021,网站优化客户报表,热门网站,追求无我1. 引言 单链表(Singly Linked List)是一种常见的数据结构,在算法和数据结构的学习中占有重要地位。翻转单链表是一道经典的面试题,本文将介绍几种常见的 Java 实现方法,并详细讲解关键步骤的含义。 2. 单链表定义 …

1. 引言

单链表(Singly Linked List)是一种常见的数据结构,在算法和数据结构的学习中占有重要地位。翻转单链表是一道经典的面试题,本文将介绍几种常见的 Java 实现方法,并详细讲解关键步骤的含义。

2. 单链表定义

我们可以先定义一个链表节点类:

class ListNode {int val;ListNode next;ListNode(int val) {this.val = val;this.next = null;}
}

3. 迭代法实现链表翻转(附详细注释)

迭代法是最常用的方法之一,使用三个指针完成整个翻转过程:

public class ReverseLinkedList {public static ListNode reverseList(ListNode head) {ListNode prev = null;       // 初始时,前一个节点指针为 nullListNode current = head;    // 当前处理的节点从链表头开始while (current != null) {ListNode nextNode = current.next; // 1. 暂存当前节点的下一个节点current.next = prev;              // 2. 将当前节点的指针指向前一个节点/** 原本 current 节点是指向下一个节点的,* 比如 current 是 2,它的 next 是 3,* 这一步将它反过来指向前面的 prev,* 也就是把 2 -> 3 改成 2 -> 1(假设 prev 是 1),* 从而实现链条的反向连接。*/prev = current;                   // 3. 移动 prev 指针/** 这一步是让 prev 继续前进,指向当前处理好的节点,* 为下一轮翻转做准备。* 假设刚刚处理的是 2,现在 prev 变成 2,* 这样下一轮就可以把 3 的指针指向 2 了。*/current = nextNode;               // 4. 继续处理下一个节点}return prev; // 最终 prev 会指向新的头节点}public static void main(String[] args) {ListNode 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);while (reversedHead != null) {System.out.print(reversedHead.val + " -> ");reversedHead = reversedHead.next;}System.out.println("NULL");}
}

复杂度分析

  • 时间复杂度:O(n),需要遍历每个节点一次;
  • 空间复杂度:O(1),只用了常数个变量。

4. 递归法实现链表翻转

递归法思路清晰,适合理解递归调用,但需要额外的调用栈空间:

public class ReverseLinkedListRecursive {public static ListNode reverseList(ListNode head) {if (head == null || head.next == null) {return head; // 递归出口,返回最后一个节点作为新头}ListNode newHead = reverseList(head.next); // 递归反转后续节点head.next.next = head; // 让后一个节点指向当前节点,实现反转head.next = null;      // 切断当前节点与后续的连接,避免成环return newHead; // 返回新头节点}public static void main(String[] args) {ListNode 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);while (reversedHead != null) {System.out.print(reversedHead.val + " -> ");reversedHead = reversedHead.next;}System.out.println("NULL");}
}

复杂度分析

  • 时间复杂度:O(n),每个节点访问一次;
  • 空间复杂度:O(n),递归调用栈占用了额外空间。

5. 总结

  • 迭代法:空间效率高,适用于大多数场景;
  • 递归法:代码简洁,适合展示递归思维,但不适合超长链表。

建议优先使用迭代法,避免递归造成的栈溢出问题。理解链表翻转的本质,就是反转每个节点的 next 指针方向,直到整个链表翻转完成。

希望本文对你理解和实现单链表翻转有所帮助!

http://www.dtcms.com/a/617635.html

相关文章:

  • 智慧交通自动驾驶场景道路异常检测数据集VOC+YOLO格式8302张6类别
  • 内联函数(Inline Functions)详细讲解
  • CentOS Stream 8 通过 Packstack 安装开源OpenStack(V版本)
  • 企业实训|自动驾驶中的图像处理与感知技术——某央企汽车集团
  • 电子商城网站建设流程外链系统
  • 数据分析笔记10:数据容器
  • 基于Django的博客系统
  • 地图引擎性能优化:解决3DTiles加载痛点的六大核心策略
  • 树莓派5-ubuntu24.04 LTS 使用python构建雷达驱动包
  • Django Nginx+uWSGI 安装配置指南
  • php网站建设培训班如何在word里做网站
  • 用Rust从零实现一个迷你Redis服务器
  • 图表设计 网站郑州汉狮做网站的公司
  • 详解高可用 SFTP 服务器搭建,适用于文档管理系统、监控系统数据、NFS、FTP、Git 仓库、Web 静态资源高可用服务器等等应用场景
  • 【故障排查】intel 服务器安装Win server 2019蓝屏解决方法
  • Vue入门到实战(day7):Vuex 与 Vue Router 深度解析,从原理到实战的前端状态与路由管理(附代码案例)
  • 3种数据模型的演变
  • Highcharts常见问题解析(5):可以在服务器上使用 Highcharts 吗?如何正确集成?
  • 用 Node.js 手动搭建 HTTP 服务器:从零开始的 Web 开发之旅!
  • 前端使用 React Query 管理“服务器状态”
  • 佛山cms建站帮人做兼职的网站
  • Spring Boot的web基础配置
  • 下载网站上的表格 怎么做天津市建设工程质量安全监督管理总队网站
  • 【Linux日新月异(八)】CentOS 7系统资源监控与排查深度指南:性能调优全景图
  • word中怎么查看插入的图片占用内存大小来压缩word文件整体大小
  • Flink CDC + MaxCompute用 MaxCompute Connector 打通实时入湖通道
  • 【AI 学习】AI Agent 开发进阶:架构、规划、记忆与工具编排
  • 二十三、Transformer架构详解
  • JAR逆向工程实战对比:传统工具 vs 自动化解决方案
  • 算法学习--离散化