单向链表
方法
- 向后追加
- 转换成字符串
- 下标插入
- 下标删除
- 根据位置获取元素
- 根据元素删除
实现
function LinkList() {
this.val = null;
this.next = null;
this.length = 0;
let num = 1;
LinkList.prototype.createNode = function (item) {
return {
val: item,
next: null,
};
};
LinkList.prototype.append = function (item) {
if (this.val) {
let curr = this
while (curr.next) {
curr = curr.next;
}
curr.next = this.createNode(item);
} else {
this.val = item;
}
this.length++;
};
LinkList.prototype.toString = function (interval = ',') {
const result = [];
this.length > 0 && result.push(this.val);
let curr = this.next;
while (curr) {
result.push(curr.val);
curr = curr.next;
}
return result.join(interval);
};
LinkList.prototype.insertAt = function (position, item = num) {
if (position > this.length || position < -this.length) return false;
if (position < 0) {
position = this.length + position;
}
const ele = this.createNode(item);
if (position === 0) {
this.next = {
val: this.val,
next: this.next,
};
this.val = item;
} else if (position === 1) {
ele.next = this.next;
this.next = ele;
} else {
let curr = this.next;
for (let i = 2; i < position; i++) {
curr = curr.next;
}
ele.next = curr.next;
curr.next = ele;
}
this.length++;
num++;
return this.toString();
};
LinkList.prototype.removeAt = function (position) {
if (position >= this.length || position < -this.length) return false;
if (position < 0) {
position = this.length + position;
}
let curr = this;
let prev = null;
let i = 0;
let result = '';
while (i++ < position) {
prev = curr;
curr = curr.next;
}
result = curr.val;
if (prev) {
prev.next = curr.next;
} else {
if (curr.next) {
this.val = curr.next.val;
this.next = curr.next.next;
} else {
this.val = null;
this.next = null;
}
}
this.length--;
return result;
};
LinkList.prototype.indexOf = function (position) {
if (position >= linkList.length || position <= -linkList.length) return false;
if (position < 0) {
position = linkList.length + position;
}
let curr = this;
for(let i = 0; i < position; i++) {
curr = curr.next;
}
return curr.val;
};
LinkList.prototype.remove = function (item) {
let prev = null;
let curr = this;
for (let i = 0; i < this.length; i++) {
if (curr.val === item) {
if (prev) {
prev.next = curr.next;
} else {
if (curr.next) {
this.val = curr.next.val;
this.next = curr.next.next;
} else {
this.val = null;
this.next = null;
}
}
} else {
prev = curr;
curr = curr.next;
}
}
};
};
功能测试
let linkList = new LinkList();
linkList.append("a");
linkList.append("b");
linkList.append("c");
linkList.insertAt(0);
linkList.insertAt(1);
linkList.insertAt(2);
linkList.insertAt(3);
linkList.insertAt(4);
linkList.insertAt(212);
linkList.insertAt(-3);
linkList.insertAt(-322);
linkList.toString();
linkList.removeAt(0);
linkList.removeAt(1);
linkList.toString();
linkList.removeAt(2);
linkList.toString();
linkList.removeAt(5);
linkList.toString();
linkList.removeAt(0);
linkList.removeAt(0);
linkList.removeAt(0);
linkList.removeAt(0);
linkList.removeAt(0);
linkList.toString();
双向链表
方法
- 后追加
- 正向遍历
- 反向遍历
- 根据位置添加
- 根据位置删除
- 获取元素位置
- 根据元素删除
实现
function DoublyLinkList() {
this.head = null;
this.tail = null;
this.length = 0;
function createNode(item, prev, next) {
return {
val: item,
prev,
next,
};
}
DoublyLinkList.prototype.append = function(item) {
if (this.length === 0) {
this.head = this.tail = createNode(item, null, null);
} else {
let curr = this.head;
while (curr.next) {
curr = curr.next;
}
curr.next = this.tail = createNode(item, curr, null);
}
this.length++;
}
DoublyLinkList.prototype.forwardString = function() {
if (!this.head) return '';
let curr = this.head;
let items = [];
while (curr) {
items.push(curr.val);
curr = curr.next;
}
return items.join(',');
}
DoublyLinkList.prototype.reverseString = function() {
if (!this.tail) return '';
let curr = this.tail;
let items = [];
while (curr) {
items.push(curr.val);
curr = curr.prev;
}
return items.join(',');
}
DoublyLinkList.prototype.insert = function(item, position) {
if ((!position && position !== 0) || position > this.length || -position - 1 > this.length) return false;
if (position < 0) {
position = this.length + position + 1;
}
let curr = this.head;
let prev = null;
if (!curr) {
this.head = this.tail = createNode(item, null, null);
} else {
if (position === 0) {
this.head = curr.prev = createNode(item, null, curr);
} else {
for (let i = 0; i < position; i++) {
prev = curr;
curr = curr.next;
}
prev.next = createNode(item, prev, curr);
if (curr) {
curr.prev = prev.next
} else {
this.tail = prev.next
}
}
}
this.length++;
}
this.forwardString();
DoublyLinkList.prototype.removeAt = function(position) {
if (!position && position !== 0) return false;
if (position >= this.length) return undefined;
if (position < 0) {
position = this.length + position;
}
this.length--;
let curr = this.head;
let prev = null;
for (let i = 0; i < position; i++) {
prev = curr;
curr = curr.next;
}
if (curr.next) {
if (prev) {
curr.next.prev = prev;
prev.next = curr.next
} else {
this.head = curr.next;
this.head.prev = null;
}
} else {
this.tail = prev;
if (prev) {
prev.next = null;
} else {
this.head = null;
}
}
return curr.val;
}
DoublyLinkList.prototype.indexOf = function(item) {
if (!this.head) return -1;
let curr = this.head;
for (let i = 0; i < this.length; i++) {
if (curr.val === item) {
return i;
}
curr = curr.next;
};
return -1;
}
DoublyLinkList.prototype.remove = function(item) {
let i = this.indexOf(item);
return i === -1 ? false : this.removeAt(i);
}
}
功能测试
let doublyLinkList = new DoublyLinkList();
doublyLinkList.append(1);
doublyLinkList.append(2);
doublyLinkList.append(3);
doublyLinkList.forwardString();
doublyLinkList.reverseString();
doublyLinkList.insert(4, 0);
doublyLinkList.forwardString();
doublyLinkList.reverseString();
doublyLinkList.insert(5, 1);
doublyLinkList.forwardString();
doublyLinkList.reverseString();
doublyLinkList.insert(6, 5);
doublyLinkList.forwardString();
doublyLinkList.reverseString();
doublyLinkList.removeAt(0);
doublyLinkList.forwardString();
doublyLinkList.reverseString();
doublyLinkList.removeAt(1);
doublyLinkList.forwardString();
doublyLinkList.reverseString();
doublyLinkList.removeAt(3);
doublyLinkList.forwardString();
doublyLinkList.reverseString();
doublyLinkList.removeAt(2);
doublyLinkList.removeAt(1);
doublyLinkList.removeAt(0);
doublyLinkList.removeAt(0);
doublyLinkList.append(1);
doublyLinkList.append(2);
doublyLinkList.append(3);
doublyLinkList.forwardString();
doublyLinkList.reverseString();
doublyLinkList.indexOf(1);
doublyLinkList.indexOf(2);
doublyLinkList.indexOf(3);
doublyLinkList.indexOf(4);
doublyLinkList.remove(2);
doublyLinkList.remove(1);
doublyLinkList.remove(0);
doublyLinkList.remove(3);
参考