链表:
单向链表用js实现
简单来说,链表就是能够指向内存当中的不连续的空间。
下面简单用js实现一下链表中的一些常用的方法:
// 创建一个node,一个节点中包含data和next指针
class Node{
constructor(element) {
this.element = element
this.next = null
}
}
// 链表序列
class LinkedList {
constructor() {
this.size = 0
this.head = null
}
// 追加链表(追加到最前面或者是最后面),***************************
// 追加链表是按照节点的方式追加把数据存到data中,然后插入节点
append(element) {
let node = new Node(element)
// 加到最前面(判断加到前边的方法:1.head指向的是null,2.或者链表的长度为0即:this.size===0)
if(this.head===null) {
this.head = node // head指向这个节点
} else {
// 添加到最后面
let current = this.getNode(this.size - 1)
current.next = node
}
this.size++
}
// 指定位置追加链表********************************************
/**
* 在指定位置插入元素,位置可能是链表的最前边或者是中间的某个位置,我们需要先做位置的
* 越界处理。
* 在最前边的插入position=0
* 在中间某处的插入,是这样的过程:我们需要找到position位置的前一个节点或是后一个节点,
* 通过将前一个节点的next指向插入元素即可
*/
appendAt(position, element) {
if(position < 0 || positon > this.size) {
throw new Error('位置越界')
}
let node = new Node(elemnet)
// 在起始位置插入
if(position===0) {
node.next = this.head // 将我们创建的node的next指针指向原来链表的第一个位置的元素
this.head = node // 将链表的head指向新的链表的第一个位置即:我们插入的元素的位置
} else {
// 在中间位置插入
let pre = this.getNode(position-1)
node.next = pre.next // 此处先赋值目的是为了将前一个元素的next保存起来
pre.next = node
}
this.size++
}
// 指定位置删除某一节点*******************************************
removeAt(position) {
if(position < 0 || position >= this.size) {
throw new Error('坐标越界')
}
let current = this.head
if(position===0) {
this.head = current.next // 当删除的是第一个位置的节点,那么,就将head指向当前删除的节点的next所指向的元素
}else {
/**
*此处删除的是某一个位置的元素,过程:我们拿到position这个下标元素的前一个元素pre,
*那么此时这个下标元素current就是pre的next所指向的元素,然后我们删除当前元素,那么其上
*一个元素的next就会是指向当前元素的next所指向的元素
*/
let pre = this.getNode(position-1)
current = pre.next
pre.next = current.next
}
this.size--
}
// 查找指定元素的索引****************************************************
/**
* 查找下标就比较简单了,通过对链表的元素进行循环,然后让其和传入的元素进行比对,相同的话
* 会返回其下标current = current.next 是为了让当前元素一致是往下走的
*/
indexOf(element) {
let current = head
for(var i = 0; i < this.size; i++) {
if(current.element===element) {
return i
}
current = current.next
}
return -1 // 如果没有找到就返回-1
}
//获取链表的某一个元素
getNode(index) {
if(index < 0 || index >= this.size) {
throw new Error('越界')
}
let current = this.head
for(var i = 0; i < index; i++){
current = current.next
}
return current
}
}
用的话就是:
let myLink = new LinkedList()
myLink.append(item)
myLink.appendAt(2,item)
... ...
链表的话还是看图会比较容易理解。

被折叠的 条评论
为什么被折叠?



