链表
原标题:链表
原文来自:CSDN 原文链接:hhttps://blog.csdn.net/abei0518/article/details/103798878
链表是一种物理上非连续、非顺序的存储结构,数据元素之间的顺序是通过每个元素的指针关联的。
链表有一系列节点组成,每个节点一般至少会包含两部分的信息:(1)元素数据 (2)指向下一个元素的指针
链表分类: (1)单向链表和双向链表 (2)静态链表(数组实现) 、动态链表(指针)
链表的操作: 创建、插入、删除、输出
链表的特点:
(1)物理空间不连续,空间开销更大
(2)在运行时可以动态添加
(3)查找元素需要顺序查找
动态链表的实现代码如下:
class Node {
constructor(data) {
//数据
this.data = data;
//指向
this.next = null;
}
}
class LinkedList {
constructor() {
this.head = null;
this.tail = null;
this.length = 0;
}
// 添加
append(data) {
// 先把内容传到node这个类里面赋值 最后拿到的结果是一个对象{data:data,next:null}
let node = new Node(data);
// 判断head是否是第一次添加 如果是的话直接赋值
if (!this.head) {
this.head = node;
this.tail = node
} else {
// 如果不是 要改变指向next
this.tail.next = node
this.tail = node
}
// 每加一次让length +1
this.length += 1;
return this;
}
// 按位置删除
remove(position) {
let current = this.head
let index = 0;
let prev = null;
// 如果位置不存在
let message = '该数据不存在'
if (position < 0 || position > this.length - 1) {
return message;
}
// 如果删除的是第一个
if (position === 0) {
// 如果是第一个的话就让head的指向等于head的下一个指向
this.head = this.head.next
} else {
// 如果不是第一个 把上一个的指向指向要删除的那一项的下一个 也就是跳过被删除的这一项
while (index++ < position) {
// 保存上一个到prev
prev = current
// 保存被删除项
current = current.next
}
// 被删除的上一个元素的指向=被删除项的指向
prev.next = current.next
// 如果删除的是最后一项
if (position === this.length - 1) {
this.tail = prev
}
}
this.length -= 1;
return current.data;
}
// 修改
updata(position, newdata) {
let message = '该数据不存在'
if (position < 0 || position > this.length - 1) {
return message;
}
let current = this.head;
let index = 0;
// 找到当前要修改的元素
while (index++ < position) {
current = current.next
}
// 修改内容
current.data = newdata
return this;
}
// 查找
get(position) {
let message = '该数据不存在'
if (position < 0 || position > this.length - 1) {
return message;
}
let current = this.head;
let index = 0;
// 找到当前的元素
while (index++ < position) {
current = current.next
}
return current.data;
}
// 插入
insert(position, data) {
let node = new Node(data)
let index = 0;
let prev = null;
let current = this.head;
// 判断是否是添加到第一个
if (position === 0) {
// 新元素的指向=原本第一个元素
node.next = this.head
this.head = node
} else {
while (index++ < position) {
// 保存上一个元素
prev = current
// 保存当前元素
current = current.next
}
// 上一个元素的指向=新添加的元素
prev.next = node
// 新添加的元素的指向=当前元素
node.next = current
}
// 如果插入的位置是最后的一个
if (position === this.length) {
this.tail = node
}
this.length += 1;
return this;
}
// 转数组
toArray() {
let arr = [];
let current = this.head
while (current) {
arr.push(current.data)
current = current.next
}
return arr;
}
// 转字符串
toString() {
let str = '';
let current = this.head
while (current) {
str += current.data + ' '
current = current.next
}
return str;
}
// 长度
size() {
return this.length
}
// 判断是否为空
isEmpty() {
return this.length === 0
}
}免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。
合作及投稿邮箱:E-mail:editor@tusaishared.com
上一篇:牛顿迭代法
热门资源
TensorFlow从1到2...
原文第四篇中,我们介绍了官方的入门案例MNIST,功...
TensorFlow从1到2...
“回归”这个词,既是Regression算法的名称,也代表...
Python 爬虫(二)...
所谓爬虫就是模拟客户端发送网络请求,获取网络响...
盲源分离算法学习笔记
麦克风阵列算法有两大类,一类是波束形成算法,另...
TensorFlow从1到2...
原来引用过一个段子,这里还要再引用一次。是关于...
智能在线
400-630-6780
聆听.建议反馈
E-mail: support@tusaishared.com