class DoubleLinkedList {
constructor(data) {
this.header = null;
this.data = data;
this.next = null;
this.prev=null;
this.tail=null
this.length = 0;
}
append(element) {
let newNode = new DoubleLinkedList(element);
if (this.length == 0) {
this.header = newNode;
this.tail=newNode
} else {
let current = this.header;
while (current.next) {
current = current.next;
}
current.next = newNode;
newNode.prev=current
this.tail=newNode
}
this.length = this.length + 1;
}
toString() {
let current = this.header;
let str = "";
while (current) {
str += current.data + " ";
current = current.next;
}
return str;
}
insert(position, element) {
if (position < 0 || position >= this.length) {
return false;
}
let newNode = new DoubleLinkedList(element);
if (position == 0) {
let oldNode = this.header;
this.header = newNode;
newNode.next = oldNode;
} else {
let current = this.header;
for (let i = 0; i < position; i++) {
current = current.next;
}
let prv = this.header;
for (let i = 0; i < position - 1; i++) {
prv = prv.next;
}
prv.next = newNode;
newNode.next = current;
}
this.length = this.length + 1;
}
removeAt(position) {
if (position < 0 || position >= this.length) {
return false;
}
if (position == 0) {
this.header = this.header.next;
}
if (position > 0 && position <= this.length - 1) {
let current = this.header;
for (let i = 0; i < position; i++) {
current = current.next;
}
let prv = this.header;
for (let i = 0; i < position - 1; i++) {
prv = prv.next;
}
if (current.next) {
prv.next = current.next;
} else {
prv.next = null;
}
}
this.length = this.length - 1;
}
remove(element) {
let res = -1;
let current = this.header;
for (let i = 0; i < this.length; i++) {
if (current.data === element) {
res = i;
}
current = current.next;
}
if (res != -1) {
this.removeAt(res);
}
}
upDate(position, element) {
if (position < 0 || position >= this.length) {
return null;
}
let current = this.header;
for (let i = 0; i < position; i++) {
current = current.next;
}
current.data = element;
}
get(position) {
if (position < 0 || position >= this.length) {
return null;
}
let current = this.header;
for (let i = 0; i < position; i++) {
current = current.next;
}
return current.data;
}
indexOf(element) {
let current = this.header;
let res = -1;
for (let i = 0; i < this.length; i++) {
if (current.data === element) {
res = i;
break;
}
current = current.next;
}
return res;
}
forward(){
if(!this.tail){
return false
}
let startNode=this.header
let arr=[]
while(startNode.next){
arr.push(startNode.data)
startNode=startNode.next
}
arr.push(startNode.data)
return arr
}
backword(){
if(!this.tail){
return false
}
let endNode=this.tail
let arr=[]
while(endNode.prev){
arr.push(endNode.data)
endNode=endNode.prev
}
arr.push(endNode.data)
return arr
}
}