链表(Linked List)
链表是由一组节点组成的集合
每个节点都是用一个对象的引用指向它的后继,指向另一个节点的引用叫做链
数组元素靠它们的位置进行引用,链表元素则是靠相互之间的关系进行引用
链表的实现
//Node类
function Node(element) {
this.element = element;
this.next = null;
}
//LinkedList类
function LList() {
this.head = new Node("head");
this.find = find;
this.insert = insert;
this.remove = remove;
this.display = display;
function find(item) {
let currNode = this.head;
while(currNode.element != item) {
currNode = currNode.next;
}
return currNode;
}
function insert(newElement, item) {
let newNode = new Node(newElement);
let current = this.find(item);
newNode.next = current.next
current.next = newNode;
}
function display() {
let currNode = this.head;
while(!(currNode.next === null)) {
console.log(currNode.next.element);
currNodec = currNode.next;
}
}
function findPrevious() {
let currNode = this.head;
while(!(currNode.next === null) &&
(currNode.next.element !== item)) {
currNode = currNode.next;
}
return currNode;
}
function remove(item) {
let prevNode = this.findPrevious(item);
if(!(prevNode.next === null)) {
prevNode.next = prevNode.next.next;
}
}
}
双向链表
function Node(element) {
this.element = element;
this.next = null;
this.previous = null;
}
function LList() {
this.head = new Node("head");
this.find = find;
this.insert = insert;
this.display = display;
this.remove = remove;
this.findLast = findLast;
this.dispReverse = dispReverse;
//反序显示双向链表中的元素
function dispReverse() {
let currNode = this.head;
currNode = this.findLast();
while(!(currNode.previous === null)) {
console.log(currNode.element);
currNode = currNode.previous;
}
}
function findLast() {
let currNode = this.head;
while(!(currNode.next === null)) {
currNode = currNode.next;
}
return currNode;
}
function remove(item) {
let currNode = this.find(item);
if(!(currNode.next === null)) {
currNode.previous.next = currNode.next;
currNode.next.previous = currNode.previous;
currNode.next = null;
currNode.previous = null;
}
}
function display() {
let currNode = this.head;
while(!(currNode.next === null)) {
console.log(currNode.next.element);
currNode = currNode.next;
}
}
function find(item) {
let currNode = this.head;
while(currNode.element !== item) {
currNode = currNode.next;
}
return currNode;
}
function insert(newElement, item) {
let newNode = new Node(newElement);
let current = this.find(item);
let nextNode = current.next;
newNode.next = nextNode;
newNode.previous = current;
if(nextNode !== null){
nextNode.previous = newNode;
}
current.next = newNode;
}
}
循环链表
function LList() {
this.head = new Node("head");
this.head.next = this.head;
this.find = find;
this.insert = insert;
this.display = display;
this.findPrevious = findPrevious;
this.remove = remove;
function find(item) {
let currNode = this.head;
while(currNode.element != item) {
currNode = currNode.next;
}
return currNode;
}
function insert(newElement, item) {
let newNode = new Node(newElement);
let current = this.find(item);
newNode.next = current.next
current.next = newNode;
}
function display() {
let currNode = this.head;
while(!(currNode.next === null) &&
!(currNode.next.element === "head")) {
console.log(currNode.next.element);
currNodec = currNode.next;
}
}
function findPrevious() {
let currNode = this.head;
while(!(currNode.next === null) &&
(currNode.next.element !== item)) {
currNode = currNode.next;
}
return currNode;
}
function remove(item) {
let prevNode = this.findPrevious(item);
if(!(prevNode.next === null)) {
prevNode.next = prevNode.next.next;
}
}
}
参考:数据结构与算法JavaScript描述