链表是一种物理存储结构上非连续、非顺序的数据结构,元素的逻辑顺序是通过链表中的指针链接次序实现的。节点由数据域和指针域构成。
如何实现链表:
(1)确定如何实现节点
(2)确定操作方法:需要实现查找指定节点方法(find),查找指定节点前一个节点方法(findPrevious),在某个节点后面插入新节点(insertAfter),删除某个节点(remove),遍历输出所有节点(display),输出当前节点(show),将指针后移n(back),将指针前移n。
具体实现:
#!/usr/bin/node
function Node(element) {
this.element = element;
this.next = null;
};
function LinkedList() {
this.head = new Node('head');
this.currNode = this.head;
// 本函数从头节点开始查找链表中任何一个节点
this.find = function (item) {
var targetNode = this.head;
while (targetNode.element !== item) {
targetNode = targetNode.next;
};
return targetNode;
};
// 本函数从头节点开始查找头节点以外的所有节点
this.findPrevious = function (item) {
var targetNode = this.head;
while (targetNode.next.element !== item) {
targetNode = targetNode.next;
};
return targetNode;
};
// 本函数在某个节点后面插入新节点
this.insertAfter = function (newElement,oldElement) {
var newNode = new Node(newElement);
var oldNode = this.find(oldElement);
newNode.next = oldNode.next;
oldNode.next = newNode;
this.currNode = newNode;
};
// 本函数删除头节点以外的所有的节点,头节点代表整个列表,删除头节点的方法就是删除整个链表
this.remove = function (item) {
var prevNode = this.findPrevious(item);
prevNode.next = prevNode.next.next;
this.currNode = prevNode;
};
// 本函数从头节点开始遍历输出头节点以外的所有节点内容
this.display = function () {
var outputPrevNode = this.head;
while (outputPrevNode.next !== null) {
console.log(outputPrevNode.next.element); // 不显示头节点
outputPrevNode = outputPrevNode.next;
};
};
this.show = function () {
console.log(this.currNode.element);
};
this.back = function (n) {
for (var i = 0; i < n; i++) {
this.currNode = this.currNode.next;
};
};
this.advance = function (n) {
for (var i = 0; i < n; i++) {
this.currNode = this.findPrevious(this.currNode.element)
};
};
};