Js实现链表操作
Js实现链表操作
JavaScript实现链表主要操作,包括创建链表、遍历链表、获取链表长度、获取第i个元素值、获取倒数第i个元素值、插入节点、删除节点、有序链表合并、有序链表交集。
创建链表
class Node{
constructor(data){
this.data = data;
this.next = null;
}
}
function createLinkList(arr){
var L = new Node(null);
var p = L;
arr.forEach(v => {
p.next = new Node(v);
p=p.next;
})
return L;
}
(function(){
var arr = [1, 3, 5, 7, 9]; // 为了方便,将数组转化为链表
var L = createLinkList(arr);
})
遍历链表
function traverseLinkList(L){
var p = L.next;
while(p){
console.log(p.data);
p = p.next;
}
}
获取链表长度
function getLinkListLength(L){
var p = L.next;
var n = 0;
while(p) {
++n;
p = p.next;
};
return n;
}
获取第i个元素值
function getIndexValue(L, index){
var p = L.next;
if(index <=0 ) return null;
var n = 0;
while(p) {
++n;
if(index === n) return p.data;
p = p.next;
};
return null;
}
获取倒数第i个元素值
function getReverseIndexValue(L, index){
var p = L.next;
if(index <=0 ) return null;
var cursor = L;
var n = 0;
while(p) {
++n;
if(n >= index) cursor = cursor.next;
p = p.next;
};
if(n < index) return null;
return cursor.data;
}
插入节点
function insertNode(L, posistion, value){
var p = L.next;
var i = 0;
while(p){
++i;
if(i === posistion) {
var saveNextP = p.next;
p.next = new Node(value);
p.next.next = saveNextP;
return true;
}
p = p.next;
}
return false;
}
删除节点
function deleteNode(L, posistion){
var p = L.next;
var preNode = L;
var i = 0;
while(p){
++i;
if(i === posistion) {
preNode.next = p.next;
p = null;
return true;
}
preNode = preNode.next;
p = p.next;
}
return false;
}
有序链表合并
function mergeLinkList(L1, L2){
var p1 = L1.next;
var p2 = L2.next;
var L3 = new Node(null);
var p3 = L3;
while(p1 && p2){
if(p1.data < p2.data){
p3.next = new Node(p1.data);
p3 = p3.next;
p1 = p1.next;
}else{
p3.next = new Node(p2.data);
p3 = p3.next;
p2 = p2.next;
}
}
while(p1) {
p3.next = new Node(p1.data);
p3 = p3.next;
p1 = p1.next;
}
while(p2){
p3.next = new Node(p2.data);
p3 = p3.next;
p2 = p2.next;
}
return L3;
}
有序链表交集
function unionLinkList(L1, L2){
var p1 = L1.next;
var p2 = L2.next;
var L3 = new Node(null);
var p3 = L3;
while(p1 && p2){
if(p1.data === p2.data){
p3.next = new Node(p1.data);
p3 = p3.next;
p1 = p1.next;
p2 = p2.next;
}else if(p1.data < p2.data){
p1 = p1.next;
}else{
p2 = p2.next;
}
}
p3.next = null;
return L3;
}
示例
class Node{
constructor(data){
this.data = data;
this.next = null;
}
}
function createLinkList(arr){
var L = new Node(null);
var p = L;
arr.forEach(v => {
p.next = new Node(v);
p=p.next;
})
return L;
}
function traverseLinkList(L){
var p = L.next;
while(p){
console.log(p.data);
p = p.next;
}
}
function getLinkListLength(L){
var p = L.next;
var n = 0;
while(p) {
++n;
p = p.next;
};
return n;
}
function getIndexValue(L, index){
var p = L.next;
if(index <=0 ) return null;
var n = 0;
while(p) {
++n;
if(index === n) return p.data;
p = p.next;
};
return null;
}
function getReverseIndexValue(L, index){
var p = L.next;
if(index <=0 ) return null;
var cursor = L;
var n = 0;
while(p) {
++n;
if(n >= index) cursor = cursor.next;
p = p.next;
};
if(n < index) return null;
return cursor.data;
}
function insertNode(L, posistion, value){
var p = L.next;
var i = 0;
while(p){
++i;
if(i === posistion) {
var saveNextP = p.next;
p.next = new Node(value);
p.next.next = saveNextP;
return true;
}
p = p.next;
}
return false;
}
function deleteNode(L, posistion){
var p = L.next;
var preNode = L;
var i = 0;
while(p){
++i;
if(i === posistion) {
preNode.next = p.next;
p = null;
return true;
}
preNode = preNode.next;
p = p.next;
}
return false;
}
function mergeLinkList(L1, L2){
var p1 = L1.next;
var p2 = L2.next;
var L3 = new Node(null);
var p3 = L3;
while(p1 && p2){
if(p1.data < p2.data){
p3.next = new Node(p1.data);
p3 = p3.next;
p1 = p1.next;
}else{
p3.next = new Node(p2.data);
p3 = p3.next;
p2 = p2.next;
}
}
while(p1) {
p3.next = new Node(p1.data);
p3 = p3.next;
p1 = p1.next;
}
while(p2){
p3.next = new Node(p2.data);
p3 = p3.next;
p2 = p2.next;
}
return L3;
}
function unionLinkList(L1, L2){
var p1 = L1.next;
var p2 = L2.next;
var L3 = new Node(null);
var p3 = L3;
while(p1 && p2){
if(p1.data === p2.data){
p3.next = new Node(p1.data);
p3 = p3.next;
p1 = p1.next;
p2 = p2.next;
}else if(p1.data < p2.data){
p1 = p1.next;
}else{
p2 = p2.next;
}
}
p3.next = null;
return L3;
}
(function(){
var arr = [1, 3, 5, 7, 9]; // 为了方便,将数组转化为链表
console.log("创建链表");
var L = createLinkList(arr);
console.log(L);
console.log("遍历链表");
traverseLinkList(L);
console.log("获取链表长度");
var n = getLinkListLength(L);
console.log(n);
console.log("获取链表第2个元素值");
var v = getIndexValue(L, 2);
console.log(v);
console.log("获取链表倒数第2个元素值");
var v = getReverseIndexValue(L, 2);
console.log(v);
console.log("在第1个节点后插入值为2的节点");
insertNode(L, 1, 2);
traverseLinkList(L);
console.log("删除第2个节点");
deleteNode(L, 2);
traverseLinkList(L);
console.log("创建两个有序链表");
console.log("L1");
var L1 = createLinkList([1, 5, 7, 10, 30]);
traverseLinkList(L1);
console.log("L2");
var L2 = createLinkList([1, 3, 7, 9, 20, 100]);
traverseLinkList(L2);
console.log("合并有序链表,不改变原链表,返回一个新链表");
var L3 = mergeLinkList(L1, L2);
traverseLinkList(L3);
console.log("取有序链表交集,不改变原链表,返回一个新链表");
var L3 = unionLinkList(L1, L2);
traverseLinkList(L3);
})();
每日一题
https://github.com/WindrunnerMax/EveryDay
Js实现链表操作的更多相关文章
- JAVA 链表操作:循环链表
主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...
- js实现动态操作table
本章案例为通过js,动态操作table,实现在单页面进行增删改查的操作. 简要案例如下: <%@ page language="java" contentType=&quo ...
- nw.js如何处理拖放操作
nw.js如何处理拖放操作 其实拖放(drag-drop)操作是Html5的功能,不是nw.js的内置API,那么我们采用Html5应用一般的处理方法就可以了. 首先我们看一下一个正常的页面,直接拖放 ...
- Numeral.js – 格式化和操作数字的 JavaScript 库
Numeral.js 是一个用于格式化和操作数字的 JavaScript 库.数字可以格式化为货币,百分比,时间,甚至是小数,千位,和缩写格式,功能十分强大.支持包括中文在内的17种语言. 您可能感兴 ...
- 【软件编程】乐易贵宾VIP教程 - JS改写+网页操作系列教程
JS改写系列教程: 1.MD5加密改写教程(爱拍网登录)2.解密如何快速找到真确的js加密算法3.多重MD5加密改写教程(5173登录)4.DZ论坛登录加密改写5.唯品会手机登录加密改写6.新浪微博密 ...
- 单链表操作B 分类: 链表 2015-06-07 12:42 15人阅读 评论(0) 收藏
数据结构上机测试2-2:单链表操作B TimeLimit: 1000ms Memory limit: 65536K 题目描述 按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除 ...
- JS实现 键盘操作
JS实现 键盘操作: 详情可以去其逛网查看其API并下载,地址:http://craig.is/killing/mice <!DOCTYPE html PUBLIC "-//W3C// ...
- js中如何操作json数据
一.要想熟练的操作json数据,就先要了解json数据的结构,json有两种结构:对象和数组. 1.对象 一个对象以“{”开始,“}”结束.每个“名称”后跟一个“:”:“‘名称/值’ 对”之间使用“, ...
- YTU 2620: B 链表操作
2620: B 链表操作 时间限制: 1 Sec 内存限制: 128 MB 提交: 418 解决: 261 题目描述 (1)编写一个函数createlink,用来建立一个动态链表(链表中的节点个数 ...
- C# 链表操作
关于链表操作,在C#当中微软已经提供了一个LinkedList<T>的数据结构,通过这个类提供的一系列方法就能够实现链表操作. 这里我提供一段代码,这是在论坛里面有人提问时给出的代码,它实 ...
随机推荐
- SpringMVC08——拦截器——2021-05-11
拦截器概述 SpringMVC的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并做相应的处理. 例如:进行权限验证.记录请求信息的日志.判断用户 ...
- ChatGPT-NextWeb部署和调试打造属于自己的GPT
首先我关注这个项目有一段时间了,不得不说作者和他的社区真的很猛! 首先这个项目截至目前已经有了40.9K的Start了,Fork也已经有了38.1K了,这个数据真的超级牛批了. 那么我们来看一下这款号 ...
- IL合集二
引言 在第一篇关于IL的文章中,我们写了一些IL的相加,创建对象,循环以及实现TryCatch的一些功能,接下来,为大家带上后续关于IL的更新,其中包括,类型转换,以及条件判断,还有定义字段,定义属性 ...
- [转帖]Prometheus 监控之 Blackbox_exporter黑盒监测 [icmp、tcp、http(get\post)、dns、ssl证书过期时间]
Blackbox_exporter 主动监测主机与服务状态 Prometheus 官方提供的 exporter 之一,可以提供 http.dns.tcp.icmp 的监控数据采集 官方github: ...
- [转帖]shell脚本实现文本内容比较交互程序
背景介绍 脚本基于Comm命令进行功能封装,考虑到命令执行前需要对文本进行排序,并且在多文件需要比较内容时可能会导致多个文本混乱,因此使用Shell封装成了一个交互式程序,快速对文件内容进行判断和输出 ...
- [转帖]Kafka 核心技术与实战学习笔记(八)kafka集群参数配置(下)
一.Topic级别参数 Topic的优先级: 如果同时设置Topic级别参数和全局Broker参数,那么Topic级别优先 消息保存方面: retention.ms:规定Topic消息保存时长.默认是 ...
- IO调度算法的简单学习与整理
IO调度算法的简单学习与整理 前言 前几天整理了 /sys/block/sda/queue/nr_requests 以及 /sys/block/sda/device/queue_depth 的两个参数 ...
- [转帖]TCP之Nagle、Cork、Delay ACK(延迟确认)
https://www.jianshu.com/p/167ba81206fb 参考资料 TCP协议中的Nagle算法 TCP中的Nagle算法 Linux下TCP延迟确认(Delayed Ack)机制 ...
- Sysbench 开启超线程/关闭超线程以及容器运行数据库的性能损耗
Sysbench 开启超线程/关闭超线程性能损耗 摘要 Stress-NG 测试完之后 突然想 使用sysbenchen也进行一次压测 验证一把 超线程对数据的性能影响. 压测命令 ./sysbenc ...
- MySQL in Windows安装以及异名恢复的简单过程
下载相关 建议获取最新版本的Mysql数据库 可以获取 zip 格式的安装文件 https://dev.mysql.com/downloads/mysql/ 或者获取 msi 格式的安装文件 http ...