java算法判断链表有没有闭环_前端算法系列之二:数据结构链表、双向链表、闭环链表、有序链表...

前言

上一次我们讲到了数据结构:栈和队列,并对他们的运用做了一些介绍和案例实践;我们也讲到了怎么简单的实现一个四则运算、怎么去判断标签是否闭合完全等等,anyway,今天接着和大家介绍一些数据结构:

链表

链表是一种怎么样的结构呢?链表就是一种可以把数据串联起来的结构,每个元素会有指向下一个元素的指针(末尾的没有普通链表),就像现实世界中的火车一样一节一节的串联起来;链表根据自身的指针指向又可以分为:单向链表、双向链表、循环链表;

8dd05ed0ac6ab39a14417467bed379fa.png

7e6b0a37c4956cb1de06bb540f90da04.png

链表首先会有一个表头,表头作为起始的指针,然后每一个元素我们称作为节点(node);每个节点有一个指向下一个节点的指针(next),直到链表的末尾指针会指向undefined;

链表的实现

1、节点

节点的创建和定义;每个节点会有一个保存自己数据的属性(element),然后有一个指针(next)export class Node {

constructor(element, next = null) {

this.element = element;

this.next = next;

}

}

2、链表的api

getElementAt(position): 获取某个位置的元素

append(element): 向链表末尾中添加元素

removeAt(idx): 移除某个元素

insert(element, position = 0, dir = 'before'): 向指定位置添加元素

insertAfter(element, position): 向指定的位置后面添加元素

size(): 链表的长度

remove(): 删除链表末端元素

removeAll(): 删除整个链表

isEmpty(): 检查链表是否为空import { defaultEquals } from "../util.js";

import { Node } from './Node.js'

export default class LinkedList {

constructor(equalsFn = defaultEquals) {

this.count = 0;

this.head = null;

this.equalsFn = equalsFn;

}

getElementAt(position) {

if(position >= 0 && position <= this.count) {

let node = this.head;

for (let i = 0; i 

node = node.next;

}

return node;

}

return undefined;

}

insertAfter(element, position) {

return this.insert(element, position, 'after');

}

size() {

return this.count;

}

remove() {

return this.removeAt(this.size() - 1);

}

removeAll() {

this.count = 0;

this.head = null;

}

isEmpty() {

return this.size() === 0;

}

getHead() {

return this.head;

}

}

3、链表末尾添加一个元素append;append(element) {

const node = new Node(element);

let current = this.head;

if(current == null) {

this.head = node;

} else {

current = this.head;

while (current.next !=  null) {

current = current.next;

}

current.next = node

}

this.count++;

return element;

}

1ff5b2fefc9c44c2cb67c7424cb56560.png

4、插入一个元素insert(element, position = 0, dir = 'before') {

if (element === undefined) {

throw Error('缺少需要插入的元素');

return;

}

if (position >= this.count) {

return this.append(element);

}

const node = new Node(element);

const targetNode = dir === 'before' ? this.getElementAt(position - 1) : this.getElementAt(position);

if (!targetNode) {

let prev = this.head;

this.head = node;

node.next = prev;

} else {

let next;

next = targetNode.next

targetNode.next = node;

node.next = next;

}

this.count++;

return element;

}

7b4f46462b4a1ad8a4daabe5cceec702.png

5、删除一个元素removeAt(idx) {

if (idx >= 0 && idx 

let current = this.head;

if (idx === 0) {

this.head = current.next;

current.next = null;

} else {

let prev = this.getElementAt(idx - 1);

current = prev.next;

prev.next = current.next;

}

this.count--;

return current.element;

}

return undefined;

}

af02d1ee102feafe8ce7c0a394d5b425.png

6、双向链表

单向链表元素指向都是一个方向的,也只能被单向递归搜索,而双向链表不仅仅有指向下一个元素的指针同时具有指向上一个元素的指针;

db3769718d506c1e98cba8839343ad3b.pngimport LinkedList from "./LinkedList";

import {defaultEquals} from "../util";

import { DoubleNode } from "./DoubleNode";

export default class DoubleLinkedList extends LinkedList{

constructor(equalIsFn = defaultEquals){

super(equalIsFn);

this.tail = null;// 队列尾部

}

getElementAt(position) {

if(position >= 0 && position <= this.count) {

if (position > this.count/2) {

let cur = this.tail;

for (let i = this.count - 1; i > position; i--){

cur = cur.prev;

}

return cur;

} else {

return super.getElementAt(position)

}

}

return undefined;

}

removeAll() {

super.removeAll();

this.tail = null;

}

removeAt(position) {

if (position >= 0 && position 

let cur = this.getElementAt(position);

if(position === 0) {

this.head = cur.next;

cur.next = null;

this.prev = null;

} else if (position === this.count - 1) {

this.tail = cur.prev;

this.tail.next = null;

cur.prev = null;

} else {

let prev = cur.prev;

let next = cur.next;

prev.next = next;

next.prev = prev;

cur.prev = null;

cur.next = null;

}

this.count--;

return cur.element;

}

return undefined;

}

}

队列末尾插入元素(append)

双向链表插入元素和单向比较类似,不同的是双向不仅要链接他的下级还得关联他的前一级;append(element) {

const node = new DoubleNode(element);

if (!this.tail) {

this.head = node;

this.tail = node;

} else {

let cur = this.tail;

cur.next = node;

node.prev = cur;

this.tail = node;

}

this.count++;

return element;

}

0d314fe470e9d7fad4bd9cf2f2ca0db3.png

中间某个位置插入元素insert(element, position = 0, dir = 'before'){

if (element === undefined) {

throw Error('缺少需要插入的元素');

return;

}

if (position >= this.count) {

return this.append(element);

}

const node = new DoubleNode(element);

let cur;

const targetNode = dir === 'before' ? this.getElementAt(position - 1) : this.getElementAt(position);

if (!targetNode) {

cur = this.head;

node.next = cur;

cur.prev = node;

this.head = node;

} else {

let next;

next = targetNode.next

targetNode.next = node;

node.prev = targetNode;

node.next = next;

next.prev = node;

}

this.count++;

return element;

}

e68854ba982cc88b620c56858fc7f29f.png

移除某个元素也是上述相同,修改节点的前后指针就可以了,这里不再赘述,详情看源码

闭环链表

闭环链表也称环,是一个闭合的结构,尾部会指向头部

222b76204e377f6bc26ade761f1c414d.png

有序链表

有序链表就是在append元素的时候进行排序加入从而得到一个有顺序的链表,比较函数可以根据实例化的时候传入比较函数equalIsFn;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果宣布加入CNCF;华为要求美国运营商支付专利费;微软删除最大的公开人脸识别数据集...

戳蓝字“CSDN云计算”关注我们哦&#xff01;嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周五第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

企业实战_14_MyCat跨分片查询_全局表

接上一篇&#xff1a;企业实战_13_MyCat清除冗余数据 https://gblfy.blog.csdn.net/article/details/100057317 文章目录一、跨分片查询验证1. 登录mycat2. 使用逻辑数据库1.3. 执行跨分片查询1.4. 异常信息&#xff0c;问题定位1.5. 表分布1.6. 跨分片查询的解决方式1.7. 场景…

java创建四叉树_Java实现 LeetCode 427 建立四叉树

427. 建立四叉树我们想要使用一棵四叉树来储存一个 N x N 的布尔值网络。网络中每一格的值只会是真或假。树的根结点代表整个网络。对于每个结点, 它将被分等成四个孩子结点直到这个区域内的值都是相同的.每个结点还有另外两个布尔变量: isLeaf 和 val。isLeaf 当这个节点是一个…

漫画:什么是二分查找?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 蠢萌的小灰来源 | 程序员小灰————— 第二天 —————什么意思呢&#xff1f;我们来举两个栗子&#xff1a;给定一个有序数组 2&#xff0c;5&#xff0c;7&#xff0c;9&#xff0c;12&#xff0c;14&#xff0c;20&…

mysql和mysqldump出现command not found 问题解决

mysql和mysqldump出现command not found 问题解决 一、给mysql配置环境变量 #找到mysql安装路径 cd /app/mysql-5.7.25 #vim /etc/profile export MYSQL_HOME/app/mysql-5.7.25 :${MYSQL_HOME}/bin二、建立软连接 1、查找mysql安装路径 find / -name mysql 通常mysql安装路径…

如何给老婆解释什么是微服务?(文末有福利)

戳蓝字“CSDN云计算”关注我们哦&#xff01;程序员有了老婆之后就是累&#xff0c;上次好不容易给她解释了什么是Restful&#xff0c;这不&#xff0c;麻烦又来了…一个周日的清晨&#xff0c;阳光洒在我的脸上&#xff0c;慢慢把我唤醒。我翻过身&#xff0c;感觉好像少了些什…

oracle19c连接MySQL_oracle19c的安装和使用navicat连接oracle数据库

一&#xff0c;数据的安装Oracle官方下载链接&#xff1a;https://www.oracle.com/downloads/#category-database首先去oracle官网下载&#xff0c;数据库里面包含了客户端&#xff0c;所以不需要再下载客户端了注意&#xff1a;有的人不下载数据库&#xff0c;只下载客户端为了…

Mycat_MySql更新数据库失败 --read-only

接上一篇&#xff1a;企业实战_20_Mycat-Web之UI监控 https://blog.csdn.net/weixin_40816738/article/details/100100053 #登录数据库 mysql -uroot -p #使用指定数据库 use 数据库名 #查看数据库处于什么状态下 show variables like read-only; #关闭read-only属性状态 set g…

Linux 运维必备的 13 款实用工具,拿好了

戳蓝字“CSDN云计算”关注我们哦&#xff01;来源 | 高效运维本文介绍几款 Linux 运维比较实用的工具&#xff0c;希望对 Linux 运维人员有所帮助。1. 查看进程占用带宽情况 - NethogsNethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽。下载&#xff1…

企业实战_12_MyCat水平扩展_分库分表

接上一篇&#xff1a;企业实战_11_MyCat垂直拆分相关配置 https://gblfy.blog.csdn.net/article/details/100055838 文章目录一、概念理论理解1. 垂直拆分理解2. 水平扩展理解3. 水平扩展案例4. 水平扩展场景5. 水平拆分原则6. 水平扩展架构图二、关键问题解决方案2.1. 分片后如…

面试阿里,我还是挂在了第四轮……

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 倪升武责编 | 郭 芮可能每个技术人都有个阿里梦&#xff0c;我也不例外。最近准备跳槽&#xff0c;前一阵子在准备各种面试&#xff0c;也面了几个大厂&#xff0c;包括阿里。是的&#xff0c;最后我挂在了第四轮。这篇文章…

Mycat+Mysql 插入数据报错 i[Err] 1064 - partition table, insert must provide ColumnList

逻辑库结构和物理库表结构如下(逻辑库结构物理库表结构)&#xff1a; CREATE TABLE order_key (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键,goods_name varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 商品名称,place varchar(2…

微服务精华问答 | 如何理解中台战略和微服务

戳蓝字“CSDN云计算”关注我们哦&#xff01;微服务(Microservice Architecture)是近几年流行的一种架构思想,关于它的概念很难一言以蔽之。今天&#xff0c;就让我们来看看关于微服务更加有深度的问题吧。1Q&#xff1a;什么是微服务A&#xff1a;1&#xff09;一组小的服务&a…

php 对象转换成数组,PHP把对象转换为数组的问题

原始对象object(Qiniu\Http\Error)#24 (2) {["url":"Qiniu\Http\Error":private]>string(25) "http://rs.qbox.me/buckets"["response":"Qiniu\Http\Error":private]>object(Qiniu\Http\Response)#25 (6) {["sta…

华为内测基于Android 10.0的EMUI 10系统;2019年Q1真无线耳机市场份额,苹果占半壁江山……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 苹果获得悬停手势专利 可隔空…

企业实战_17_MyCat水平扩展_跨分片查询_ER分片

接上一篇&#xff1a;企业实战_16_MyCat全局自增ID https://blog.csdn.net/weixin_40816738/article/details/100064315 案例比较&#xff1a; 在垂直拆分场景中&#xff0c;针对字段个数少的类型为字典类型的表&#xff0c;我们可以使用全局表的方式解决。 在水平扩展场景中&a…

bmob php支付,支付服务 - 支付服务RESTful 开发文档 - 《Bmob 文档中心》 - 书栈网 · BookStack...

注意&#xff1a;目前支付宝无法使用&#xff0c;请用户暂时不要接入&#xff0c;等待官方的恢复公告&#xff01;打款需知1.打款前请先在控制台填写以下信息2.每月的1、2、16、17号为申请打款时间&#xff0c;15号、月尾日为打款时间&#xff0c;确保用户有半个月的追诉期。Bm…

企业实战_22_MyCatSQL拦截

接上一篇&#xff1a;企业实战_21_MyCat_keepalived 安装配置验证 https://gblfy.blog.csdn.net/article/details/100073474 Mycat SQL拦截应用场景&#xff0c;可以指定监控的sql类型 文章目录1. 在server.xml文件中添加sql拦截属性标签2. 测试验证3. 查看sql拦截监控日志1. 在…

MongoDB凭什么跻身数据库排行前五?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 孙浩峰DB-Engines 数据库流行度排行榜发布了5 月份的数据&#xff0c;前六名的排名“千年不变”&#xff0c;分别是&#xff1a;Oracle、MySQL、Microsoft SQL Server、PostgreSQL、MongoDB 和IBM Db2。而其中&#xff0c;Mo…

企业实战_23_MyCat SQL防火墙

接上一篇&#xff1a;企业实战_22_MyCatSQL拦截 https://blog.csdn.net/weixin_40816738/article/details/100073474 文章目录1. SQL防火墙_白名单配置2. 白名单测试3. SQL防火墙_黑名单配置4. SQL防火墙_黑名单测试SQL防火墙&#xff1a;包括2个标签<whitehost></whi…