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

JavaScript 简单链表题目试析

JavaScript 简单链表题目试析

147. 对链表进行插入排序

算法思路

插入排序在链表中的实现其实比在数组中更自然,因为链表本身的结构让节点插入变得很高效——只需要调整指针,而不需要像数组那样移动大量元素。

我们依然是将链表分成已排序和未排序两部分。开始时已排序部分只有第一个节点,然后逐个处理未排序部分的节点,找到它们在已排序部分的正确位置并插入。

为了处理可能在头部插入的情况,使用一个虚拟头节点可以大大简化代码逻辑。

JavaScript 实现

function insertionSortList(head) {if (!head) return null;// 创建虚拟头节点const dummyHead = new ListNode(0);dummyHead.next = head;let lastSorted = head;     // 已排序部分的最后一个节点let curr = head.next;      // 当前待插入的节点while (curr !== null) {if (lastSorted.val <= curr.val) {// 当前节点大于等于已排序部分的最后一个节点,位置正确lastSorted = lastSorted.next;} else {// 需要找到插入位置let prev = dummyHead;while (prev.next.val <= curr.val) {prev = prev.next;}// 执行插入操作lastSorted.next = curr.next;curr.next = prev.next;prev.next = curr;}curr = lastSorted.next;}return dummyHead.next;
}

1721. 交换链表中的节点

算法思路

这个问题的关键在于如何高效地找到正数第 k 个和倒数第 k 个节点。使用双指针技巧可以在一次遍历中完成这个任务。

先用一个指针移动 k-1 步找到正数第 k 个节点,然后同时移动两个指针,当第一个指针到达末尾时,第二个指针正好指向倒数第 k 个节点。

JavaScript 实现

function swapNodes(head, k) {let fast = head;let firstNode = null;let secondNode = head;// 找到正数第 k 个节点for (let i = 1; i < k; i++) {fast = fast.next;}firstNode = fast;// 找到倒数第 k 个节点while (fast.next !== null) {fast = fast.next;secondNode = secondNode.next;}// 交换节点值[firstNode.val, secondNode.val] = [secondNode.val, firstNode.val];return head;
}

JavaScript 与 C 语言的差异体验

从 C 语言转到 JavaScript 来处理链表问题,有几个明显的不同点值得注意。

内存管理变得简单了 在 C 中我们需要小心翼翼地处理 malloc 和 free,生怕出现内存泄漏。但在 JavaScript 中,垃圾回收机制自动处理这些琐事,让我们可以更专注于算法逻辑本身。不过这也意味着我们对内存的控制力变弱了,有时候可能不太习惯。

语法更加简洁 JavaScript 的解构赋值特性让变量交换变得异常简单,一行 [a, b] = [b, a] 就搞定了在 C 中需要三行代码才能完成的任务。这种语法糖确实让代码更加清晰易读。

类型系统更加灵活 不需要在变量声明时指定类型,这让代码写起来更快,但也增加了运行时出现类型错误的风险。

空值表示不同 从 NULL 到 null 的转变虽然只是大小写的区别,但在实际编程中经常需要提醒自己不要写错。JavaScript 的 null 和 undefined 之间的细微差别也是初学者容易困惑的地方。

在实际开发中,虽然现代 JavaScript 提供了很多高级特性,但对于链表这种基础数据结构,保持代码的清晰和简洁往往比使用炫技式的复杂写法更重要。


文章转载自:

http://DLILMqov.zcsyz.cn
http://3s5MOQfV.zcsyz.cn
http://qyYYAy2z.zcsyz.cn
http://7h1vcUIx.zcsyz.cn
http://F4GdRFiE.zcsyz.cn
http://gRT7wXqW.zcsyz.cn
http://HUUlqxj1.zcsyz.cn
http://6g1SER2s.zcsyz.cn
http://03u4uPQs.zcsyz.cn
http://CGRzl7Yz.zcsyz.cn
http://DhfFgn1r.zcsyz.cn
http://VZnQD3v2.zcsyz.cn
http://7T75yS1Z.zcsyz.cn
http://XekjPNlJ.zcsyz.cn
http://avo84TDD.zcsyz.cn
http://X2uWtJjt.zcsyz.cn
http://voCmHiqD.zcsyz.cn
http://I1OS7cMQ.zcsyz.cn
http://9eroR2lz.zcsyz.cn
http://6qC0B6iS.zcsyz.cn
http://MtCrbMLQ.zcsyz.cn
http://XrJdzeQC.zcsyz.cn
http://xW9Yg0Hu.zcsyz.cn
http://mxyjaatr.zcsyz.cn
http://1edKAuHh.zcsyz.cn
http://os3pl8LX.zcsyz.cn
http://8vuVykc2.zcsyz.cn
http://wHXSwJO2.zcsyz.cn
http://qIFI41zE.zcsyz.cn
http://eIt7rZCy.zcsyz.cn
http://www.dtcms.com/a/383082.html

相关文章:

  • 【ZYNQ开发篇】Petalinux和电脑端的静态ip地址配置
  • 电商AI导购系统的模型部署架构:TensorFlow Serving在实时推荐中的实践
  • 光射三缝实验
  • K8s部署 Redis 主从集群
  • Android点击桌面图库应用启动流程trace分析
  • 【抗量子安全】全球视角下 PQC 与 QKD 技术洞察:政策引领与产业演进
  • 代码随想录学习摘抄day9(回溯1-11)
  • 数据处理指令
  • SpringBoot 中 ZK 与 Kafka 节点选择逻辑:底层原理与实践解析
  • 事务与mysql数据库锁的关系
  • 继承类模板:函数未在模板定义上下文中声明,只能通过实例化上下文中参数相关的查找找到
  • 07-Redis 基础操作全攻略:从键管理到数据类型判断
  • 【linux】特殊权限
  • [数据结构] 排序
  • Python网络与多任务编程:TCP/UDP实战指南
  • Elasticsearch面试精讲 Day 17:查询性能调优实践
  • Go-zero 构建 RPC 与 API 服务全流程
  • CRI容器运行时接口
  • 《Python 自动化表单填写全攻略:从基础操作到实战案例》
  • 黑马程序员JVM基础学习笔记
  • 驰骋低代码BPM开发平台的组成部分
  • ubuntu22.04源码安装ffmpeg-4.4
  • 黑马Java进阶教程,全面剖析Java多线程编程,并发和并行,笔记02
  • 大数据毕业设计选题推荐-基于大数据的教育与职业成功关系可视化分析系统-Spark-Hadoop-Bigdata
  • Ubuntu Server 安装图形界面和通过Window远程桌面连接服务器(Xrdp)
  • 贪心算法在云计算虚拟机部署问题中的应用
  • macOS中找不到钥匙串访问
  • 基于FPGA实现LeNet-5(经典CNN识别手写数字)推理
  • 算法-双指针5.6
  • Eino Indexer 组件完全指南