切换主题
双向链表
本篇在单向链表的基础上手动实现JavaScript中没有的数据结构:双向链表。
定义节点
首先我们在单向链表节点结构的基础扩展双向链表结构:
JavaScript
class DoublyNode extends ListNode {
constructor(val) {
super(val)
this.prev = null
}
}
覆写单链表添加节点
JavaScript
class DoublyLinkedList extends LinkedList {
constructor() {
super()
this.tail = null
}
// 覆写单链表添加节点
addAt(val, idx) {
if (idx >= 0 && idx <= this.len) {
const node = new DoublyNode(val)
let cur = this.head
if (idx === 0) {
if (this.head == null) {
this.head = node
this.tail = node
} else {
node.next = cur
cur.prev = node
this.head = node
}
} else if (idx === this.len) {
cur = this.tail
cur.next = node
node.prev = cur
this.tail = node
} else {
const prev = this.getAt(idx - 1)
cur = prev.next
node.next = cur
cur.prev = node
node.prev = prev
prev.next = node
}
this.len++
return true
}
return false
}
}
覆写单链表移除节点
JavaScript
class DoublyLinkedList extends LinkedList {
// 其它逻辑代码...
removeAt(idx) {
if (idx >= 0 && idx < this.len) {
let cur = this.head
if (idx === 0) {
this.head = cur.next
if (this.len === 1) {
this.tail = null
} else {
this.head.prev = null
}
} else if (idx === this.len - 1) {
cur = this.tail
this.tail = cur.prev
this.tail.next = null
} else {
prev = this.getAt(idx - 1)
cur = prev.next
prev.next = cur.next
cur.next.prev = prev
}
this.len--
return cur.val
}
return undefined
}
}
完整代码
查看
JavaScript
class DoublyLinkedList extends LinkedList {
constructor() {
super()
this.tail = null
}
// 覆写单链表添加节点
addAt(val, idx) {
if (idx >= 0 && idx <= this.len) {
const node = new DoublyNode(val)
let cur = this.head
if (idx === 0) {
if (this.head == null) {
this.head = node
this.tail = node
} else {
node.next = cur
cur.prev = node
this.head = node
}
} else if (idx === this.len) {
cur = this.tail
cur.next = node
node.prev = cur
this.tail = node
} else {
const prev = this.getAt(idx - 1)
cur = prev.next
node.next = cur
cur.prev = node
node.prev = prev
prev.next = node
}
this.len++
return true
}
return false
}
removeAt(idx) {
if (idx >= 0 && idx < this.len) {
let cur = this.head
if (idx === 0) {
this.head = cur.next
if (this.len === 1) {
this.tail = null
} else {
this.head.prev = null
}
} else if (idx === this.len - 1) {
cur = this.tail
this.tail = cur.prev
this.tail.next = null
} else {
prev = this.getAt(idx - 1)
cur = prev.next
prev.next = cur.next
cur.next.prev = prev
}
this.len--
return cur.val
}
return undefined
}
}