范范 2020-02-23
//双向循环链表 class DoubleNode { constructor (data) { this.data = data this.prev = null this.next = null } } class DoubleCycleList { constructor () { this.head = null this.tail = null this.length = 0 } //追加数据 append (data) { let newNode = new DoubleNode(data) let current = this.head //判断是否为空 if (!this.head) { this.head = newNode this.tail = newNode this.head.prev = this.tail this.tail.next = this.head //否则在末尾添加数据 }else { newNode.prev = this.tail newNode.next = this.head this.head.prev = newNode this.tail.next = newNode this.tail = newNode } this.length++ return true } //插入数据 insert (posi, data) { let newNode = new DoubleNode(data) let current = this.head let index = 0 if (posi < 0 || posi > this.length || !Number.isInteger(posi)) return false if (posi == 0) { if (!this.head) { this.head = newNode this.tail = newNode this.head.prev = this.tail this.tail.next = this.head }else { newNode.next = this.head newNode.prev = this.tail this.head.prev = newNode this.tail.next = newNode this.head = newNode } }else if (posi == this.length) { newNode.prev = this.tail newNode.next = this.head this.head.prev = newNode this.tail.next = newNode this.tail = newNode }else { while (index++ < posi - 1) { current = current.next } newNode.next = current newNode.prev = current.prev current.prev.next = newNode current.prev = newNode } this.length++ return true } //查询 indexOf (data) { let current = this.head let index = 0 while (current != this.tail) { if (current.data === data) { return index }else { index++ current = current.next } } if (current.data === data) { return index } return -1 } //删除指定位置 removeAt (posi) { let current = this.head let index = 0 if (posi < 0 || posi > this.length || !Number.isInteger(posi)) return false if (posi == 0) { if (this.length == 1) { this.head = null this.tail = null }else { this.head.next.prev = this.tail this.tail.next = this.head.next this.head = this.head.next } }else if (this.length - 1 == posi) { this.tail.prev.next = this.head this.head.prev = this.tail.prev this.tail = this.tail.prev }else { while (index++ < posi -1) { current = current.next } current.next = current.next.next current.next.prev = current } this.length-- return true } remove (data) { return this.removeAt(this.indexOf(data)) } isEmpty () { return this.head == null } size () { return this.length } tostring () { let current = this.head let re = ‘‘ while (current != this.tail) { re += ‘,‘ + current.data current = current.next } re += ‘,‘+current.data return re.slice(1) } } let dList = new DoubleCycleList() dList.insert(0, 0) dList.append(1) dList.append(2) dList.append(3) dList.append(4) dList.insert(5, ‘number5‘)