前言
有句话为算法为程序员的内核。最近前端vue3的项目刚实现完,最近的具体打算就是复习一下JS高级语法和数据结构,我大一的时候曾学习过数据结构当时用的C语言,那时候C语言基础还不扎实就去硬学。导致我对数据结构一直有敬畏之心。实际上当我对JavaScript这门有更深入了解后,简单数据结构实现起来并不难。JavaScript是一门单线程非阻塞语言,在浏览器端有重大作为。JavaScript对前端工程师的重要性不言而喻。
最近很焦虑,自己的前端圈子在不断拓宽,认识了一些优秀的人。比如合工大机械大三转码成功进入字节实习等。这些大佬真的就是吾辈楷模吧。谁不是在焦虑之下才能成长的呢?不多说了,本篇博客是围绕链表展开的。有详细的代码注释了已经。
提示:以下是本篇文章正文内容,下面案例可供参考
一、链表是什么?
1、基础概念
链表和数组一样,可以用于存储一系列的元素,但是链表和数组的实现机制是完全不同的。链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。(即在数据逻辑上是线性的),它的每个结点由两个域组成:①存储数据元素的数据域。②存储下一个结点地址的指针域。
2、与数组进行对比
优点:
1.内存空间不是必须连续的.可以充分利用计算机的内存.实现灵活的内存动态管理.
2.链表不必在创建时就确定大小,并且大小可以无限的延伸下去.
3.链表在插入和删除数据时,时间复杂度可以达到O(1).相对数组效率高很多.
缺点
1.链表访问任何一个位置的元素时,都需要从头开始访问.(无法跳过第一个元素访问任何一个元素).
2.无法通过下标直接访问元素,需要从头一个个访问,直到找到对应的元素.
二、单链表的代码实现(JavaScript版)
代码如下(示例):
<script>
//封装链表类
function LinkedList() {
//内部的类:节点类
function Node(data) {
this.data = data
this.next = null
}
//属性
this.head = null
this.length = 0
//1.在链表尾添加节点
LinkedList.prototype.append = function (data) {
//1.创建新节点
var newNode = new Node(data)
//2.判断是否添加的是第一个节点
if (this.head == null) { //2.1是第一个节点
this.head = newNode
} else { //2.2不是第一个节点
var current = this.head
while (current.next) {
current = current.next
}
current.next = newNode
// console.log(1)
}
//3.length+1
this.length += 1
}
//2.toString方法
LinkedList.prototype.toString = function () {
//1.定义变量
var current = this.head
var result = ''
//2.循环获取一个个节点
while (current) {
result += current.data + ' '
current = current.next
}
return result
}
//3.insert方法
LinkedList.prototype.insert = function (position, data) {
//1.对position进行判断
if (position < 0 || position > this.length) return false
//2.根据data创建newNode
var newNode = new Node(data)
//3.判断插入的位置是否是第一个
if (position == 0) {
newNode.next = this.head
this.head = newNode
} else {
var current = this.head
var previous = null
var index = 0
while (index < position) {
previous = current
current = current.next
index++
}
newNode.next = current
previous.next = newNode
}
//4.length+1
this.length += 1
return true
}
//4.get方法
LinkedList.prototype.get = function (position) {
//1.对position进行判断
if (position < 0 || position > this.length) return false
//2.获取对应的data
var current = this.head
var index = 0
while (index < position) {
current = current.next
index++
}
return current.data
}
//5.indexof方法
LinkedList.prototype.indexof = function (data) {
var current = this.head
var index = 0
while (current) {
if (data == current.data) {
return index
}
index += 1
current = current.next
}
//如果没找到
return -1
}
//6.updata方法根据某个位置修改该位置的元素
LinkedList.prototype.update = function (position, newData) {
//1.对position进行判断
if (position < 0 || position >= this.length) return false
//2.查找正确节点
var current = this.head
var index = 0
while (index < position) {
current = current.next
index += 1
}
current.data = newData
return true
}
//7.removeAt方法
LinkedList.prototype.removeAt = function (position) {
//1.对position进行判断
if (position < 0 || position >= this.length) return null
//2.判断删除的是不是第一个节点
var current = this.head
if (position == 0) {
this.head = this.head.next
} else {
var index = 0
var previous = null
while (index < position) {
previous = current
current = current.next
index++
}
//前一个节点next指向后一个节点
previous.next = current.next
}
this.length -= 1
return current.data
}
//8.remove方法(删除指定data的节点)
LinkedList.prototype.remove = function (data) {
//1.获取data在列表中的位置
var position = this.indexof(data)
//2.根据位置信系删除节点
return this.removeAt(position)
}
//9.isEmpty方法()
LinkedList.prototype.isEmpty = function () {
return !this.length ? true : false
}
//10.size方法()
LinkedList.prototype.size = function () {
return this.length
}
}
//以下为一些测试代码。
var linklist = new LinkedList()
linklist.append('hdf')
linklist.append('hdf1')
linklist.append('hdf2')
linklist.append('hdf3')
linklist.insert(4, '123')
linklist.update(4, '1468451684654')
linklist.remove('hdf')
// linklist.removeAt(2)
// alert(linklist.get(4))
// alert(linklist.indexof('123'))
alert(linklist.toString())
alert(linklist.isEmpty())
alert(linklist.size())
</script>
总结
希望能继续加油吧。为什么我每次只有emo的时候才会写博客呢?或者说我把博客当作自己的朋友圈一样。最近看了一个牛客大佬的个人博客,看见他的生活博客篇,去北漂的他,不知道为什么我能感觉到他可能是我未来的样子。大概率在未来要一个人背井离乡,肩负家庭重担,虽然我没有他那么强那么优秀。欢迎各位进行交流,最后感谢大家访问我的博客,我是一名半路出家的前端程序员。