基本数据结构之链表(js版本)
// 单向链表
function LinkedList() {
var head;//头部节点
var last;//尾部节点
var size = 0;//链表长度
let _this = this;
function Node(element) {
this.data = element;
this.next = null;
}
//插入链表
this.insert = function (data, index) {//插入链表操作
if (index < 0 || index > size) {
throw new Error("超出链表得范围")
}
let insertedNode = new Node(data);//创建插入节点
if (size == 0) {
//空链表
head = insertedNode;
last = insertedNode;
} else if (index == 0) {
//插入头部
insertedNode.next = head;
head = insertedNode;
} else if (size == index) {
//插入尾部
last.next = insertedNode;
last = insertedNode;
} else {
//插入中间
let prevNode = _this.get(index - 1);
insertedNode.next = prevNode.next;
prevNode.next = insertedNode;
}
size++;
}
//查询链表
this.get = function (index) {
if (index < 0 || index > size) {
throw new Error("超出链表得范围")
}
let temp = head;
for (let i = 0; i < index; i++) {
temp = temp.next;
}
return temp;
}
//删除链表
this.remove = function (index) {
if (index < 0 || index > size) {
throw new Error("超出链表得范围")
}
let removeNode = null;
if (index == 0) {
//删除头节点
removeNode = head;
head = head.next;
} else if (index == size - 1) {
//删除尾节点
let prevNode = _this.get(index - 1);
removeNode = prevNode.next;
prevNode.next = null;
last = prevNode
} else {
//删除中间节点
let prevNode = _this.get(index - 1);
let nextNode = prevNode.next.next;
removeNode = prevNode.next;
prevNode.next = nextNode;
}
size--;
}
this.updata = function (data, index) {
if (index < 0 || index > size) {
throw new Error("超出链表得范围")
}
//更新节点
let nowNode = _this.get(index);
nowNode.data = data;
}
this.output = function () {//输出节点
let temp = head;
while (temp) {
console.log(temp.data)
temp = temp.next;
}
}
}
let myLinkedList = new LinkedList();//创建链表
myLinkedList.insert(2, 0)//插入节点
myLinkedList.insert(3, 1)//插入节点
myLinkedList.insert(5, 1)//插入节点
myLinkedList.updata(4, 1);//更新节点
myLinkedList.remove(0);//删除节点0
console.log(myLinkedList.get(0))
myLinkedList.output()//输出所有节点得值
以上是自己根据小灰算法java版本改变成js版本,如果有什么错误希望指出谢谢!
后续还会推出其他算法都是js版本,敬请关注。