【前端算法】定义一个JS函数,反转单向链表

简介: 介绍链表与数组的区别,以及它们之间的联系

链表

  • 链表是一种物理结构(非逻辑结构),类似数组
  • 数组需要一段连续的内存空间,而链表试试零散的
  • 链表节点的数据结构{value, next?, prev?}

链表 VS 数组

  • 都是有序结构
  • 链表:查询慢 O(n), 新增和删除快O(1)
  • 数组:查询快O(1),新增和删除慢O(n)

创建链表代码示例

interface ILinkNode {
  value: number
  next?: ILinkNode
}

function createLinkNode (arr: number[]): ILinkNode {
  const len = arr.length
  if (len === 0) throw Error('this is a empty array');

  let curNode:ILinkNode = {
    value: arr[len-1]
  }

  if (len === 1) return curNode;

  for(let i = len -2; i >= 0; i--){
    curNode = {
      value: arr[i],
      next: curNode
    }
  }

  return curNode
}

解题思路

  • 反转,即节点next指向前一个节点
  • 但这很容易造成nextNode 的丢失
  • 需要三个指针 prevNode curNode nextNode

反转单向链表代码示例

function reverseLinkNode (linkNode:ILinkNode):ILinkNode {
  // 定义3个指针
  let prevNode: ILinkNode | undefined
  let curNode: ILinkNode | undefined
  let nextNode: ILinkNode | undefined = linkNode

  // 以nextNode为主,遍历链表
  while (nextNode) {
    // 删除第一个元素的next,防止循环引用
    if(curNode && !prevNode) {
     delete curNode.next
    }

    // 反转指针
    if (curNode && prevNode) {
      curNode.next = prevNode
    }

    // 整体向后移动
    prevNode = curNode
    curNode = nextNode
    nextNode = (nextNode as ILinkNode)?.next
  }
  // 最后一个补充:当nextNode为空时,curNode没有next时,设置next指向prevNode
  curNode!.next = prevNode

return curNode!
}

功能测试

const arr = [100,200,300]
const link = createLinkNode(arr)
console.log(link)
/*
{
  "value": 100,
  "next": {
    "value": 200,
    "next": {
      "value": 300
    }
  }
}
*/
console.log(reverseLinkNode(link))
/*
{
  "value": 300,
  "next": {
    "value": 200,
    "next": {
      "value": 100
    }
  }
} 
*/

能够跟据数组创建一个完整的单向链表,且反转单向链表功能正常。

单元测试

describe('反转链表', () => {
    it('单个元素', () => {
        const node = { value: 100}
        const node1:ILinkNode = reverseLinkNode(node)
        expect(node1).toEqual({ value: 100})
    })
    
    it('多个元素', () => {
        const arr = [100, 200, 300]
        const node:ILinkNode = createLinkNode(arr)
        const node1:ILinkNode = reverseLinkNode(node)
        expcet(node1).toEqual({
            value: 300,
            next: {
                value: 200,
                next: {
                    value: 100
                }
            }
        })
    })
})
相关文章
|
6月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
281 19
|
8月前
|
前端开发 JavaScript 数据可视化
58K star!这个让网页动起来的JS库,前端工程师直呼真香!
Anime.js 是一款轻量级但功能强大的JavaScript动画引擎,它能够以最简单的方式为网页元素添加令人惊艳的动效。这个项目在GitHub上已经获得58,000+星标,被广泛应用于电商页面、数据可视化、游戏开发等场景。
310 8
|
8月前
|
JavaScript 前端开发 容器
|
8月前
|
JavaScript 前端开发
|
8月前
|
存储 JavaScript 前端开发
|
8月前
|
移动开发 JavaScript 前端开发
|
8月前
|
JavaScript
JS实现多条件搜索函数
JS封装的多条件搜索
|
9月前
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
8056 23
|
8月前
|
存储 JavaScript 前端开发
|
8月前
|
JavaScript 前端开发

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    570
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    228
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    220
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    159
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    269
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    401
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    175
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    111
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    187
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    257