之前最主要的是实现了add
方法,在这里会实现剩余所有的方法
remove
remove
用于移除节点,该方法的实现与add
方法相似:
- 首先是对特殊位置的情况进行处理
- 当索引等于0的时候,直接将
head
指向,之前head
的next
就好了
- 当索引等于0的时候,直接将
- 其次其他情况,通过改变需要删除元素的前一个元素的
next
指向被删除元素的下一个元素完成
remove(index: number ) {
this.#checkRange(index)
let node: Node<E>
if (index === 0) {
node = this.#head as Node<E>
this.#head = node.next
} else {
let preNode = this.#node(index - 1)
node = preNode.next as Node<E>
preNode.next = node.next
}
this.#size--
return node.value
}
indexOf
根据元素查找在链表中的索引值(第一次出现的位置)
- 通过从head节点开始遍历
- 用局部变量
isExist
标注是否存在该元素
indexOf(element: E) {
let node = this.#head as Node<E>
let index = 0
let isExist = false
while (node) { // 当node不为null时就继续循环
if (node.value === element) {
isExist = true // 标识元素确实存在
break
}
index++ // 这就是索引
node = node.next as Node<E>
}
if (!isExist) {
index = -1
}
return index
}
contains
判断元素是否存在,在完成了indoeOf
方法之后,这个方法就简单了!
contains(element: E) {
return this.indexOf(element) !== -1
}
结束语
到这里单向链表就是实现完了,这也是我学习的第一种数据结构,真是不简单呐