1.这里我们实现的是单向链表,首先我们要理解什么是链表,链表就是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
2.在js中我们没有具体的指针操作,那是因为js底层帮我们实现了,例如:
var a = {name: 'li', age: 100};
在这样一串代码中,js底层帮助我们创建了{name: 'li', age: 100}
这样一个对象在堆内存中,并把表示这个对象在内存中的位置的指针赋值给了a变量。
3.具体到代码里,我们就用这样一个类:
class Node {
constructor(element){
this.element = element; this.next = null;
}
}
通过new的方式创建新的链表中的成员,并通过linklist的类来进行链表的一些基本操作,例如:删除、头部新增、底部新增、成员插入的操作,具体实现如下:
const linkList = (function(){
//生成链表中的成员
class Node {
constructor(element){
this.element = element;
this.next = null;
}
}
// 因为链表中的头部位置和长度为私有属性,所以用weakmap
let head = new WeakMap();
let len = new WeakMap();
// 链表操作对象
return class linkList {
constructor(){
len.set(this,0);
head.set(this,null);
};
//在最后增加链表对象
append(element){
const node = new Node(element);
if(this.getHead() === null){
head.set(this,node);
this.addLen();
}else{
let lastNode = this.getHead();
while(lastNode.next){
lastNode = lastNode.next;
};
lastNode.next = node;
this.addLen();
}
return this.getHead();
};
// 在中间插入链表对象
insert(position,element){
let _position = 0;
let node = new Node(element);
let positionNode = this.getHead();
let positionNextNode = null;
console.log(len.get(this));
//位置大于初始位置且小于最后位置就正常插入
if(position > 0 && position < len.get(this)){
while(_position !== position){
_position++;
positionNode = positionNode.next;
};
positionNextNode = positionNode.next;
positionNode.next = node;
node.next = positionNextNode;
console.log(this.getHead());
};
//如果位置在末尾位置就直接调用append
if(position === len.get(this)){
this.append(element);
};
//如果位置在初始位置则直接调用unshift
if(position === 0)this.unshift(element);
return this.getHead();
};
//删除链表对象
del(index){
//index必须为有效的位置
if(index <= len.get(this) && index >0){
let position = 0;
let node = this.getHead();
let parentNode = null;
while(position < index + 1){
position ++
parentNode = node;
node = node.next;
}
parentNode.next = node.next;
node.next = null;
return this.getHead();
}
}
//在链表的头部新增
unshift(element){
let node = new Node(element);
node.next = this.getHead();
head.set(this,node);
return this.getHead();
};
// 获取链表头部
getHead(){
return head.get(this);
};
// 修改链表的长度变量
addLen(){
let l = len.get(this);
l++;
len.set(this,l);
}
}
})();
var list = new linkList();
list.append(0);
list.append(1);
list.append(2);
list.append(3);
list.insert(1,1.5);
list.unshift(-1);
list.del(3)