非常重要
- 链表非连续,会带上下个node的信息
- 链表无法通过索引直接找到对应元素
链表合并
前一个链表指向新节点,新节点指向后一个链表
const nextNode = node.next node.next = newNode newNode.next = nextNode
链表删除
前一个链表指向后一个链表
内存清理会自动删除当前节点
cur.next = cur.next.next // 删掉了cur.next节点
dummy节点
链表最难处理的就是最开始的节点和最后面的节点,不如直接设置两个空节点,之后直接返回dummy.next即是链表的起点
const dummy = new Node() dummy.next = head return dummy.next
快慢指针
当需要删除指定位置的结点时,我们可以通过快慢指针,找到该结点前置结点的位置,然后连接前置和后置结点,达到删除结点的效果
多指针
用来cur.next = pre处理反转链表问题
// 记录一下 next 结点 let next = cur.next; // 反转指针 cur.next = pre; // pre 往前走一步 pre = cur; // cur往前走一步 cur = next;
每次处理cur和pre的指针,然后整体向后移一位,最后返回pre
环形链表判断
快慢指针法
快指针一次跳两个 慢指针一次跳一个,重合则有环
flag法
map存遍历的结点的值,为true则有环
例题