博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用 JavaScript 实现链表操作 - 02 Length & Count
阅读量:6389 次
发布时间:2019-06-23

本文共 1179 字,大约阅读时间需要 3 分钟。

TL;DR

计算链表的长度和指定元素的重复次数。系列目录见 。

需求

实现一个 length() 函数来计算链表的长度。

length(null) === 0length(1 -> 2 -> 3 -> null) === 3

实现一个 count() 函数来计算指定数字在链表中的重复次数。

count(null, 1) === 0count(1 -> 2 -> 3 -> null, 1) === 1count(1 -> 1 -> 1 -> 2 -> 2 -> 2 -> 2 -> 3 -> 3 -> null, 2) === 4

length

递归版本

递归是最有表达力的版本。思路非常简单。每个链表的长度 length(head) 都等于 1 + length(head.next) 。空链表长度为 0 。

function length(head) {  return head ? 1 + length(head.next) : 0}

循环版本 - while

链表循环第一反应是用 while (node) { node = node.next } 来做,循环外维护一个变量,每次自增 1 即可。

function lengthV2(head) {  let len = 0  let node = head  while (node) {    len++    node = node.next  }  return len}

循环版本 - for

forwhile 在任何情况下都是可以互换的。我们可以用 for 循环把变量初始化,节点后移的操作都放到一起,简化一下代码量。注意因为 len 要在 for 外部作为返回值使用,我们只能用 var 而不是 let/const 声明变量。

function lengthV3(head) {  for (var len = 0, node = head; node; node = node.next) len++  return len}

count

递归版本

length 思路类似,区别只是递归时判断一下节点数据。

function count(head, data) {  if (!head) return 0  return (head.data === data ? 1 : 0) + count(head.next, data)}

循环版本

这里我直接演示的 for 版本,思路类似就不多说了。

function countV2(head, data) {  for (var n = 0, node = head; node; node = node.next) {    if (node.data === data) n++  }  return n}

参考资料

转载地址:http://cldha.baihongyu.com/

你可能感兴趣的文章
Linux-百度云之AccleriderMini使用
查看>>
bootstrapTable refresh 方法使用简单举例
查看>>
2、TestNG+Maven+IDEA环境搭建
查看>>
maven插件运行过程中自动执行sql文件
查看>>
New UWP Community Toolkit - XAML Brushes
查看>>
C# ==、Equals、ReferenceEquals 区别与联系 (转载)
查看>>
layer弹出层的关闭问题
查看>>
LeetCode——3Sum & 3Sum Closest
查看>>
netstat详解
查看>>
微信小程序 --- e.currentTarget.dataset.id 获取不到值
查看>>
Introducing stapbpf – SystemTap’s new BPF backend
查看>>
详细介绍MySQL/MariaDB的锁
查看>>
0603-Zuul构建API Gateway-通过Zuul上传文件,禁用Zuul的Filter
查看>>
cocos2dx-2.x CCFileUtils文件管理分析(2)
查看>>
Emacs中多个golang项目的配置方法
查看>>
未知宽高div水平垂直居中3种方法
查看>>
Vim替换查找
查看>>
如何用sysbench做好IO性能测试
查看>>
利用线性回归模型进行卫星轨道预报
查看>>
懒加载和预加载
查看>>