function LinkedList() {
function Node(element) {
this.element = element;
this.next = null;
}
let length = 0;
let head = null;
this.append = (element) => {
let node = new Node(element);
let current;
if (head == null) {
head = node;
} else {
current = head;
while (current.next) {
current = current.next;
}
current.next = node;
}
++length;
};
this.removeAt = (position) => {
if (position > -1 && position < length) {
let current = head;
let previous, index = 0;
// previous是对要移除元素的前一个元素的引用
// current是对要移除元素的引用
// 所以要移除current元素,就需要将previous.next 与 current.next 链接起来。
if (position == 0) {
head = current.next;
} else {
while (index++ < position) {
previous = current;
current = current.next;
}
previous.next = current.next;
}
--length;
return current.element;
} else {
return null;
}
};
this.insert = (position, element) => {
if (position >= 0 && position <= length) {
let node = new Node(element);
let current = head;
let previous, index = 0;
if (position == 0) {
node.next = current;
head = node;
} else {
while (index++ < position) {
previous = current;
current = current.next;
}
node.next = current;
previous.next = node;
}
++length;
return true;
} else {
return false;
}
};
this.toString = () => {
let current = head;
let str = "";
while (current) {
str += current.element + " ";
current = current.next;
}
return str;
};
this.indexOf = (element) => {
let current = head;
let index = 0;
while (current) {
if (current.element == element) {
return index;
}
++index;
current = current.next;
}
return -1;
};
this.remove = (element) => {
let index = this.indexOf(element);
return this.removeAt(index);
};
this.isEmpty = () => {
return length == 0;
};
this.size = () => {
return length;
};
this.getHead = () => {
return head;
};
}
let list = new LinkedList();
list.append(15);
list.append(10);
list.append(22);
console.log(list.toString());
let index = list.indexOf(10);
console.log(index);
list.append(33);
console.log(list.size());
console.log(list.toString());