链表
原标题:链表
原文来自: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
上一篇:牛顿迭代法
热门资源
Python 爬虫(二)...
所谓爬虫就是模拟客户端发送网络请求,获取网络响...
TensorFlow从1到2...
原文第四篇中,我们介绍了官方的入门案例MNIST,功...
TensorFlow从1到2...
“回归”这个词,既是Regression算法的名称,也代表...
机器学习中的熵、...
熵 (entropy) 这一词最初来源于热力学。1948年,克...
TensorFlow2.0(10...
前面的博客中我们说过,在加载数据和预处理数据时...
智能在线
400-630-6780
聆听.建议反馈
E-mail: support@tusaishared.com