function Node() {
this.data = null;
this.next = null;
this.pre = null;
}
function DoubleLinkedList() {
this.length = 0;
this.head = new Node();
this.tail = this.head;
this.empty = function () {
return this.tail === this.head
};
this.exist = function (value) {
let cur = this.head;
while (cur) {
if (cur.data === value) {
return true;
}
cur = cur.next;
}
return false
};
this.get = function (index) {
if (index >= this.length) {
throw new Error("下标越界")
}
let cur = this.head.next;
let n = 0;
while (cur) {
if (n === index) {
return cur.data
}
cur = cur.next
n++
}
};
this.add = function (value) {
const new_node = new Node();
new_node.data = value;
new_node.next = this.head.next;
new_node.pre = this.head;
if (this.head.next) {
this.head.next.pre = new_node;
} else {
this.tail = new_node;
}
this.head.next = new_node;
this.length++;
};
this.append = function (value) {
const new_node = new Node();
new_node.data = value;
new_node.pre = this.tail
this.tail.next = new_node;
this.tail = new_node;
this.length++;
};
this.show = function () {
let cur = this.head.next;
let s = "";
while (cur) {
s += cur.data + " "
cur = cur.next;
}
console.log(s)
};
this.insert = function (index, value) {
if (index < 0) {
throw new Error("插入位置错误");
}
const new_node = new Node();
new_node.data = value;
let n = 0;
let cur = this.head;
while (cur.next) {
if (n === index) {
new_node.next = cur.next;
new_node.pre = cur;
cur.next.pre = new_node;
cur.next = new_node;
this.length++;
return
}
n++;
cur = cur.next;
}
new_node.pre = cur;
cur.next = new_node;
this.tail = new_node;
this.length++;
};
this.index = function (value) {
let cur = this.head.next;
let n = 0;
while (cur) {
if (cur.data === value) {
return n
}
cur = cur.next;
n++;
}
return -1
};
this.delete = function (index) {
if (index >= this.length) {
throw new Error("下标越界:" + index);
}
let cur = this.head;
let n = 0;
while (cur && cur.next) {
if (n === index) {
cur.next = cur.next.next;
if (cur.next) {
cur.next.pre = cur;
} else {
this.tail = cur;
}
this.length--;
return
}
n++;
cur = cur.next;
}
};
this.remove = function (value) {
let cur = this.head;
while (cur.next) {
if (cur.next.data === value) {
cur.next = cur.next.next;
if (cur.next) {
cur.next.pre = cur;
} else {
this.tail = cur;
}
this.length--;
return;
}
cur = cur.next;
}
throw new Error("删除数据不存在" + value);
};
this.pop = function () {
if (!this.head.next) {
throw new Error("链表为空")
}
let cur = this.tail.pre;
const data = this.tail.data;
cur.next = cur.next.next;
this.tail = cur
this.length--;
return data;
}
}
l = new DoubleLinkedList();
l.add(10)
l.add(9)
l.add(8)
console.log(l.get(1))
l.append(1)
l.append(2)
l.show()
console.log(l.pop())
console.log(l.pop())
console.log(l.tail.data)
l.show()
【数据结构连载一线性表】【双向链表】javascript
最新推荐文章于 2024-11-07 22:43:35 发布