javascript数据结构和算法——链表,双向链表
一、单向链表
<script>
class Node {
constructor(element) {
this.element = element;
this.next = null;
}
}
class linkList {
constructor() {
this.head = null;
this.length = 0;
}
append(element) {
let newEle = new Node(element)
if (this.length === 0) {
this.head = newEle;
} else {
let current = this.head;
while (current.next) {
current = current.next;
}
current.next = newEle;
}
this.length++;
}
toString() {
let result = '';
let current = this.head;
while (current) {
result += current.element + " ";
current = current.next;
}
return result;
}
insert(position, element) {
let insertEle = new Node(element);
if (position < 0 || position > this.length) {
return false;
}
if (position == 0) {
insertEle.next = this.head;
this.head = insertEle;
} else {
let index = 0;
let current = this.head;
let prov = null;
while (index++ < position) {
prov = current;
current = current.next;
}
prov.next = insertEle;
insertEle.next = current;
}
this.length++;
return true;
}
get(position) {
if (position < 0 || position > this.length) {
return false;
}
let index = 0;
let current = this.head;
while (index++ < position) {
current = current.next;
}
return current.element;
}
indexOf(ele) {
let index = 0;
let current = this.head;
while (current) {
if (current.element === ele) {
return index;
}
current = current.next;
index++;
}
return -1;
}
updata(position, newData) {
if (position < 0 || position > this.length) {
return false;
}
let current = this.head;
let index = 0;
while (index++ < position) {
current = current.next;
}
current.element = newData;
return true;
}
removeAt(position) {
if (position < 0 && position >= this.length) {
return false;
} else {
let index = 0;
let current = this.head;
let prov = null;
while (index++ < position) {
prov = current;
current = current.next;
}
prov.next = current.next;
}
return true;
}
remove(ele) {
let position = this.indexOf(ele);
this.removeAt(position);
}
isEmpty(){
return this.length == 0;
}
size(){
return this.length;
}
}
let list = new linkList();
list.append("aaa");
list.append("bbb");
list.append("ccc");
list.append('ddd');
console.log(list.toString());
console.log(list.isEmpty());
console.log(list.size());
</script>
二、双向链表
<script>
class Node {
constructor(element) {
this.element = element;
this.next = null;
this.prov = null;
}
}
class DoublyLinkedList {
constructor() {
this.head = null;
this.tail = null;
this.length = 0;
}
append(element) {
let newNode = new Node(element);
if (this.length === 0) {
this.head = newNode;
this.tail = newNode;
} else {
newNode.prov = this.tail;
this.tail.next = newNode;
this.tail = newNode;
}
this.length++;
}
toString() {
let result = "";
let current = this.head;
while (current) {
result += current.element + " ";
current = current.next;
}
return result;
}
forwordString() {
let result = "";
let current = this.tail;
while (current) {
result += current.element + " ";
current = current.prov;
}
return result;
}
backWordString() {
return this.toString();
}
insert(position, element) {
let insertNode = new Node(element);
if (position < 0 && position > this.length) {
return false;
}
if (this.length === 0) {
this.head = insertNode;
this.tail = insertNode;
} else {
if (position === 0) {
insertNode.next = this.head;
this.head.prov = insertNode;
this.head = insertNode;
} else if (position === this.length) {
insertNode.prov = this.tail;
this.tail.next = insertNode;
this.tail = insertNode;
} else {
let index = 0;
let current = this.head;
while (index++ < position) {
current = current.next;
}
insertNode.next = current;
insertNode.prov = current.prov;
current.prov.next = insertNode;
current.prov = insertNode;
}
}
this.length++;
return true;
}
get(position) {
if (position < 0 && position >= this.length) {
return false;
}
let index
let current;
if (this.length / 2 > position) {
index = this.length - 1;
current = this.tail;
while (index-- > position) {
current = current.prov;
}
} else {
index = 0;
current = this.head;
while (index++ < position) {
current = current.next;
}
}
return current.element;
}
indexOf(element) {
let index = 0;
let current = this.head;
while (current) {
if (current.element === element) {
return index;
}
current = current.next;
index++;
}
return -1;
}
updata(position, element) {
if (position < 0 && position >= this.length) {
return false;
}
let index;
let current;
if (this.length / 2 > position) {
index = 0;
current = this.head;
while (index++ < position) {
current = current.next;
}
} else {
index = this.length - 1;
current = this.tail;
while (index-- > position) {
current = current.prov;
}
}
current.element = element;
return true;
}
removeAt(position) {
if (position < 0 && position >= this.length) {
return false;
}
let index = 0;
let current = this.head;
if (this.length === 1) {
this.head = null;
this.tail = null;
} else {
if (position === 0) {
this.head = this.head.next;
this.head.prov = null;
} else if (position === this.length - 1) {
current = this.tail;
this.tail = this.tail.prov;
this.tail.next = null;
} else {
while (index++ < position) {
current = current.next;
}
current.prov.next = current.next;
current.next.prov = current.prov;
}
}
this.length--;
return current.element;
}
remove(ele){
let place = this.indexOf(ele);
this.removeAt(place);
this.length--;
}
isEmpty(){
return this.length=== 0;
}
size(){
return this.length;
}
forHead(){
return this.head.element;
}
forBack(){
return this.tail.element;
}
}
let double = new DoublyLinkedList();
double.append("aaa");
double.append("bbb");
double.append("ccc");
double.append("ddd");
console.log(double.isEmpty());
console.log(double.size());
console.log(double.forHead());
console.log(double.forBack());
</script>