数据结构与算法JavaScript描述练习------第6章链表

手把手教你用 JavaScript 实现常见数据结构与算法 你是否遇到过这样的场景?写前端代码时想优化列表渲染性能,却不知道用链表还是数组更高效;面试时被问“用 JS 实现一个栈”,结果卡壳在 API 设计;想自己写个小框架,却对虚拟 DOM 的树结构遍历一头雾水?本文正是为解决这些问题而生:覆盖6 类核心数据结构(数组、链表、栈、队列、树、图)和5 大经典算法(排序、搜索、递归、动态规划、贪心),用 JS 代码+生活案例,让你“既能写代码,又懂为什么这么写”。本文从“生活场景”切入,先讲数据结构(像认识工具),再讲算法(像学习工具的用法),最后用实战案例串联。 阅读详情

1. 实现 advance(n) 方法,使当前节点向前移动 n 个节点。

function Node(element) {
	this.element = element;
	this.next = null;
}

function LList() {
	this.head = new Node("head");
	this._current = this.head;
	this.find = find;
	this.insert = insert;
	this.findPrevious = findPrevious;
	this.remove = remove;
	this.display = display;
	this.advance = advance;
}

function find(item) {
	var currNode = this.head;
	while (currNode.element != item) {
		currNode = currNode.next;
        if (currNode == null) {
            return null;
        }
	}
	return currNode;
}

function insert(newElement, item) {
	var newNode = new Node(newElement);
	var current = this.find(item);
    if (current) {
	    newNode.next = current.next;
	    current.next = newNode;
    }
}

function display() {
	var currNode = this.head;
	while (!(currNode.next == null)) {
		console.log(currNode.next.element);
		currNode = currNode.next;
	}
}

function findPrevious(item) {
	var currNode = this.head;
	while (!(currNode.next == null) && (currNode.next.element != item)) {
		currNode = currNode.next;
	}
	return currNode;
}

function remove(item) {
	var prevNode = this.findPrevious(item);
	if (!(prevNode.next == null)) {
		prevNode.next = prevNode.next.next;
	}
}

function advance(n) {
	if (n < 0) {
		console.error("Cannot advance with negative number.");
        return;
	}
	var count = 0;
	while (count < n && this._current.next !== null) {
		this._current = this._current.next;
		count++;
	}
}

2. 实现 back(n) 方法,使当前节点向后移动 n 个节点。

function Node(element) {
	this.element = element;
	this.next = null;
}

function LList() {
	this.head = new Node("head");
	this._current = this.head;
	this.find = find;
	this.insert = insert;
	this.findPrevious = findPrevious;
	this.remove = remove;
	this.display = display;
	this.back = back;
}

function find(item) {
	var currNode = this.head;
	while (currNode.element != item) {
		currNode = currNode.next;
        if (currNode == null) {
            return null;
        }
	}
	return currNode;
}

function insert(newElement, item) {
	var newNode = new Node(newElement);
	var current = this.find(item);
    if (current) {
	    newNode.next = current.next;
	    current.next = newNode;
    }
}

function display() {
	var currNode = this.head;
	while (!(currNode.next == null)) {
		console.log(currNode.next.element);
		currNode = currNode.next;
	}
}

function findPrevious(item) {
	var currNode = this.head;
	while (!(currNode.next == null) && (currNode.next.element != item)) {
		currNode = currNode.next;
	}
	return currNode;
}

function remove(item) {
	var prevNode = this.findPrevious(item);
	if (!(prevNode.next == null)) {
		prevNode.next = prevNode.next.next;
	}
}

function back(n) {
	if (n < 0) {
		console.error("Cannot back with negative number.");
        return;
	}
	var count = 0;
	while (count < n && this._current !== this.head) {
		this._current = this.findPrevious(this._current.element);
		count++;
	}
}

3. 实现 show() 方法,只显示当前节点上的数据。

function Node(element) {
	this.element = element;
	this.next = null;
}

function LList() {
	this.head = new Node("head");
	this._current = this.head;
	this.find = find;
	this.insert = insert;
	this.findPrevious = findPrevious;
	this.remove = remove;
	this.display = display;
	this.show = show;
}

function find(item) {
	var currNode = this.head;
	while (currNode.element != item) {
		currNode = currNode.next;
        if (currNode == null) {
            return null;
        }
	}
	return currNode;
}

function insert(newElement, item) {
	var newNode = new Node(newElement);
	var current = this.find(item);
    if (current) {
	    newNode.next = current.next;
	    current.next = newNode;
    }
}

function display() {
	var currNode = this.head;
	while (!(currNode.next == null)) {
		console.log(currNode.next.element);
		currNode = currNode.next;
	}
}

function findPrevious(item) {
	var currNode = this.head;
	while (!(currNode.next == null) && (currNode.next.element != item)) {
		currNode = currNode.next;
	}
	return currNode;
}

function remove(item) {
	var prevNode = this.findPrevious(item);
	if (!(prevNode.next == null)) {
		prevNode.next = prevNode.next.next;
	}
}

function show() {
	console.log(this._current.element);
}

4. 使用单向链表写一段程序,记录用户输入的一组测验成绩。

function recordScores() {
    var list = new LList();
    console.log("请输入一组测验成绩,每输入一个成绩按回车键确认,输入 'end' 结束输入:");
    function readInput() {
        var input = prompt("请输入成绩:");
        if (input === 'end') {
            console.log("所有成绩记录完成。");
            console.log("成绩列表:");
            list.display();
            return;
        }

        var score = parseInt(input);
        if (isNaN(score)) {
            console.error("无效的输入,请输入一个有效的整数。");
            readInput(); 
        } else {
            list.insert(score, list._current.element);
            list.advance(1);
            readInput(); 
        }
    }

    readInput();
}

recordScores();

5. 使用双向链表重写例 6-4 的程序。

function Node(element) {
	this.element = element;
	this.next = null;
	this.previous = null;
}

function LList() {
	this.head = new Node("head");
	this.find = find;
	this.insert = insert;
	this.remove = remove;
	this.display = display;
	this.findLast = findLast; 
	this.dispReverse = dispReverse;
}

function find(item) {
	var currNode = this.head;
	while (currNode.element != item) {
		currNode = currNode.next;
        if (currNode == null) {
            return null;
        }
	}
	return currNode;
}

function insert(newElement, item) {
	var newNode = new Node(newElement);
	var current = this.find(item);
    if (current) {
	    newNode.next = current.next;
	    newNode.previous = current;
	    if (current.next !== null) {
		    current.next.previous = newNode;
	    }
	    current.next = newNode;
    }
}

function display() {
	var currNode = this.head;
	while (!(currNode.next == null)) {
		console.log(currNode.next.element);
		currNode = currNode.next;
	}
}

function remove(item) {
	var currNode = this.find(item);
	if ((!currNode) && !(currNode.next == null)) {
		currNode.previous.next = currNode.next;
		currNode.next.previous = currNode.previous;
		currNode.previous = null;
		currNode.next = null;
	}
}

function findLast() {
	var currNode = this.head;
	while (!(currNode.next == null)) {
		currNode = currNode.next;
	}
	return currNode;
}

function dispReverse() {
	var currNode = this.head;
	currNode = this.findLast();
	while (!(currNode.previous == null)) {
		console.log(currNode.element);
		currNode = currNode.previous;
	}
}

var cities = new LList();
cities.insert("conway", "head");
cities.insert("Russellville","conway");
cities.insert("carlisle","Russellville");
cities.insert("Alma","carlisle");
cities.display();
cities.remove("carlisle");
cities.display();
cities.dispReverse();

6. 传说在公元 1 世纪的犹太战争中,犹太历史学家弗拉维奥·约瑟夫斯和他的 40 个同胞 被罗马士兵包围。犹太士兵决定宁可自杀也不做俘虏,于是商量出了一个自杀方案。他 们围成一个圈,从一个人开始,数到第三个人时将第三个人杀死,然后再数,直到杀光 所有人。约瑟夫和另外一个人决定不参加这个疯狂的游戏,他们快速地计算出了两个位 置,站在那里得以幸存。写一段程序将 n 个人围成一圈,并且第 m 个人会被杀掉,计算 一圈人中哪两个人最后会存活。使用循环链表解决该问题。


function Node(element) {
	this.element = element;
	this.next = null;
}

function LList() {
	this.head = new Node("head");
	this.head.next = this.head;
	this.find = find;
	this.insert = insert;
	this.findPrevious = findPrevious;
	this.remove = remove;
	this.display = display;
	this.initList = initList;
}

function find(item) {
	var currNode = this.head;
	while (currNode.element != item) {
		currNode = currNode.next;
		if (currNode == this.head) {
			return null;
		}
	}
	return currNode;
}

function insert(newElement, item) {
	var newNode = new Node(newElement);
	var current = this.find(item);
	newNode.next = current.next;
	current.next = newNode;
}

function display() {
	var currNode = this.head;
	while (!(currNode.next == this.head)) {
		console.log(currNode.next.element);
		currNode = currNode.next;
	}
}

function findPrevious(item) {
	var currNode = this.head;
	while (currNode.next.element != item) {
		currNode = currNode.next;
		if (currNode == this.head) {
			return null;
		}
	}
	return currNode;
}

function remove(item) {
	var prevNode = this.findPrevious(item);
	if (!(prevNode == null)) {
		prevNode.next = prevNode.next.next;
	}
}

function initList(n) {
    for (let i = n; i > 0; i--) {
        this.insert(i, "head");
    }
}

function josephusProblem(n, m) {
    var list = new LList();
    list.initList(n);

    var currNode = list.head.next;
	var count = n;
	while (count > 2) {
        for (var i = 1; i < m; i++) {
            currNode = currNode.next;
        }
        var nextNode = currNode.next;

        list.remove(currNode.element);
		count--;
		console.log("还剩:" + count + "人");
        currNode = nextNode;
    }
	console.log("存活的2人最开始应站立的位置为:" + list.head.next.element + "," + list.head.next.next.element);
}

const n = 41;
const m = 3;
console.log(josephusProblem(n, m)); 

JavaScript深入讲解数据结构与算法 本文还有配套的精品资源,点击获取 简介:《用JavaScript来介绍数据结构与算法》是一份系统的编程资料,通过JavaScript语言深入剖析数据结构与算法的核心概念。本资料详细介绍和比较了数组、链表、栈、队列、哈希表、树和图等数据结构,并且讨论了排序、搜索、动态规划、贪心算法、回溯法等重要算法。掌握这些知识点对于JavaScript开发者而言是提升编程技能和优化代码性能... 阅读详情

相关推荐

JavaScript数据结构转换:数组与链表互转实战

链表节点类最基本的属性是value和next,分别表示节点存储的值和指向下一个节点的引用。在 JavaScript 中,我们可以使用类(class)来定义节点类。// 节点存储的数据// 指向下一个节点的引用属性说明:属性名类型描述valueany节点中存储的数据,可以是任意类型next指向下一个节点的引用,若为链表尾节点,则为 null该类设计简单明了,仅包含两个基础属性,便于后续扩展。例如,若需要支持双向链表,可以添加prev。

weixin_34162851的博客 1131

数据结构和算法javascript描述-链表(第6章)

6 链表 ++链表通常由一连串节点组成,每个节点包含任意的实例数据和1个或者2个用来指向上一个或者下一个节点位置的链接++ 一个node节点通常长这个样子 node data数据 next指针 previous指针 6.1 单向链表 单向链表是链表结构中最简单的,一个单链表的节点(node)分为两部分,第一部分(data)保存和显示节点的相关信息,另一个部分(next)...

weixin_33816821的博客 120

树莓派5首次开机保姆级教程(无显示器通过VNC连接树莓派桌面)

选择 Interface Options > VNC > Yes 启用服务。2.在Windows电脑上安装VNC软件。重启树莓派:sudo reboot。3.使用VNC远程访问树莓派桌面。

qq_34184505的博客 2351

【数据结构与算法】详解什么是链表,并用代码手动实现一个链表结构

本文将来讲解一下一种常见的线性数据结构—链表,因为链表和数组一样都是一种线性的数据结构,但是它俩的实现原理是完全不同的,所以在讲解链表之前,我们来回顾一下 数组 结构。

零一的博客 1万+

AD5940阻抗测量开发板实战:从源码获取到工程调试全解析

本文详细解析了AD5940阻抗测量开发板的实战应用,从源码获取到工程调试的全过程。AD5940作为ADI公司的高精度阻抗测量前端芯片,适用于生物阻抗分析、电化学传感器等领域。文章提供了开发环境搭建、工程配置、常见问题排查及进阶调试技巧,帮助开发者快速掌握AD5940开发板的使用方法。

weixin_30919429的博客 213

Python主要智能优化算法库汇总

最近几年简单浏览和对比了一些智能算法的库。现将各种库的主要信息、相关优缺点简单整理如下,各位同学可根据自己的需求和喜好进行选择。 文章目录1、DEAP2、mealpy3、scikit-opt (国产良心)4、Geat2(国产用心)5、pygmo26、pyswarms7、SciPy(想不到吧)小结 1、DEAP 项目地址:https://github.com/DEAP/deap 安装: pip install deap 优点: 起点高,发表在Journal of Machine Learning Rese

半个冯博士 2万+

《数据结构与算法JavaScript描述》

《数据结构与算法JavaScript描述》 基本信息 作者: (美)Michael McMillan 译者: 王群锋 杜欢 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115363398 上架时间:2014-8-5 出版日期:2014 年8月 开本:16开 版次:1-1 所属分类:计算机 > 软件与程序设计 > 网络编程 > ...

weixin_30607029的博客 747

手把手教你用TP4056和PMOS管搭建锂电池自动切换电路(含元器件选型指南)

本文详细介绍了如何使用TP4056和PMOS管搭建锂电池自动切换电路,包括核心架构设计、元器件选型指南和PCB布局优化。通过智能充电算法和电源路径切换模块,实现外部供电与锂电池的无缝切换,提升便携式设备的电源管理效率。

julia4scientist的博客 890

为什么要学习数据结构与算法javascript描述

在过去的几年中,得益于Node.js和SpiderMonkey这样的平台,JavaScript越来越多地被用于服务器端编程。鉴于JavaScript语言已经走出了浏览器,程序员发现他们需要更多传统语言,比如C++和Java提供的工具。这些工具包括经典的数据结构,如链表、栈、队列、图等,也包括经典的排序和查找算法。本书即讨论了在使用JavaScript进行服务器端编程时,如何实现这些经典的数据结构和

多多 2594

webapi .net core8.0配置使用Token权限认证

本人在网上找了很多版本,不是太复杂就是不行。

m0_74824592的博客 1760

统信UOS下获取root权限的两种姿势:图形化开启开发者模式 vs 命令行直接提权

本文详细解析了统信UOS下获取root权限的两种方法:通过图形界面永久开启开发者模式和使用命令行临时提权。开发者模式适合系统级开发,提供完整root权限但降低安全性;临时提权则更灵活,适合日常管理任务。文章还对比了两种方案的优缺点,帮助用户根据需求选择最佳权限管理策略。

weixin_30266885的博客 515

资料分享:送你一本《数据结构与算法JavaScript描述》电子书!

数据结构 是掌握计算机编程必须具备的技能。通常情况下,我想掌握一门编程语言所用的方法就是利用这门语言把数据结构中线性表、栈、队列、字符串、动态数字、整数集合、树、图、搜索、排序等涉及的算法全部写一遍。写完之后,基本上就把这门语言搞定了。 今天给大家分享的就是我从网上找到的利用 JavaScript 语言来实现各种数据结构的算法,希望这本电子书对学习 JavaScript 想从事前端工作的读者有益。...

老马的程序人生 4380

化工设备设计软件:PVELITE二次开发_(12).数据导入导出与兼容性

在数据导入之前,需要定义数据在PVELITE中的结构。可以通过编程接口定义字段名称和数据类型。# 导入必要的库 import pvelite # 创建PVELITE实例 pve = pvelite . PVELITE() # 定义CSV数据结构 csv_structure = {

kkchenjj的博客 1216

JavaScript数据结构与算法学习总结--链表

数据结构与算法这个内容很多人一听都会觉得头大,我在最开始接触到的时候也是云里雾里。因为大一刚学编程的时候,一直连入门都如不进去,导致后来学习数据结构和算法也提不起兴趣。直到开始接触Web前端,学习了JavaScript这门脚本语言,便想学习一些基于JS的数据结构与算法知识,并且记录下来。于是便有了这篇博客~     数据结构分为线性结构与非线性结构,我觉得线性结构相对于非线性结构更好理解一些。而

qq_28581549的博客 1171

双目摄像头全景解析:从几何光学到深度智能

双目视觉系统基于仿生学原理,通过水平排列的双摄像头模拟人眼视差机制实现三维感知。其核心是通过标定、校正、匹配等算法流程,将视差转换为深度信息,最终生成三维点云。该系统在自动驾驶、机器人导航、工业检测等领域有广泛应用,但面临弱纹理、重复图案等挑战。未来发展趋势包括与事件相机、深度学习等技术的融合,进一步提升精度和动态性能。

reset2021的博客 120

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

javascript数据结构与算法

数据结构:数据的组织形式,如数组、链表、树、图等,用于高效存储和访问数据 算法:解决问题的步骤,是指令的有限序列,其中每条指令表示一个或多个操作。它具备有穷性(有限步骤内完成)、确定性(每一步都有确切含义)、可行性(能通过有限次操作实现)等基本特性 数据结构为算法提供了操作的对象和基础,而算法则通过操作这些数据结构中的数据来实现特定的功能和性能要求

Hi_MrXiao的博客 1286

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

「数据结构与算法Javascript描述」链表

「数据结构与算法Javascript描述」链表「数据结构与算法Javascript描述」链表1. 为什么需要链表2. 链表的定义3. 设计一个基于对象的链表3.1 Node 类3.2 LinkedList类3.3 插入新的节点3.4 从链表中删除一个节点4. 双向链表5. 循环链表 「数据结构与算法Javascript描述」链表 1. 为什么需要链表 在很多编程语言中,数组的长度是固定 的,所以当数组已被数据填满时,再要加入新的元素就会非常困难。在数组中,添加和删除元素也很麻烦,因为需要将数组中的其他元素向

p1967914901的博客 1289

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数据结构与算法——JS实现(链表遍历与逆置)

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

weixin_44873331的博客 1836

JavaScript 版数据结构与算法

数据结构与算法

weixin_49809163的博客 1406

《数据结构与算法JavaScript描述》读书笔记

总的来说,书的质量不太高,如果作为前端工程师算法入门的书的话,不如去读《算法图解》,相比之下更容易理解,讲解也更加准确。这本JavaScript描述只是用了JavaScript去实现一些基础算法,而且实现的也不是很令人满意。

多啦的博客 512

Javascript描述-数据结构与算法

☆     数据结构是以某种形式将数据组织在一起的集合,它不仅存储数据,还支持访问和处理数据的操作。算法是为求解一个问题需要遵循的、被清楚指定的简单指令的集合。      下面是我总结整理出的关于数据结构与算法的相关内容,如有错误,欢迎交流。本文中对于方法的封装均采用JavaScript语言来实现。...

weixin_43689100的博客 402

JavaScript数据结构与算法笔记

JavaScript数据结构与算法笔记

qq_43645678的博客 1144

Javascript数据结构——链表

在JavaScript中,链表作为一种常见的基础数据结构,具有节点动态分配、内存使用灵活等特点,特别适用于插入和删除操作频繁的场景。总之,链表在JavaScript中具有广泛的应用场景和算法题目。掌握链表的基本结构和操作是实现这些算法和应用的基础。通过不断练习和实践,可以加深对链表的理解和掌握。:判断链表中是否存在环形结构,这通常可以使用快慢指针的技巧来实现。:从头到尾遍历链表,处理每个节点的值或指针。:将两个有序链表合并成一个有序链表。

警警的博客 1549

js-stl与ES6+新特性的完美结合:现代JavaScript数据结构开发指南

js-stl是一个基于JavaScript实现的高效数据结构库,它巧妙融合了ES6+新特性,为开发者提供了丰富的数据结构实现方案。无论是链表、树、图还是排序算法,js-stl都通过现代化的JavaScript语法和设计模式,让数据结构的使用变得简单而高效。 ## 为什么选择js-stl?现代JavaScript开发的必备工具 在JavaScript生态中,虽然原生提供了Array、Object

gitblog_09810的博客 959

「算法与数据结构」JavaScript中的链表

写在前面此文会先探讨下什么是链表以及在 JavaScript 中的链表,接着我们会使用 JavaScript 这门语言动手实现下各类链表的设计,最后我们会抛出一些常规疑问,并从各个方面一...

isboyjc的博客 384
上一篇: 数据结构与算法JavaScript描述练习------第5章队列
下一篇: 数据结构与算法JavaScript描述练习------第7章字典
maxiumII
博客等级 码龄17年 436粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值