移除链表元素:
虚拟头节点,cur代表被删元素前的指针,使用tmp记录被删元素,最后要把tmp释放空间
反转链表:
需要3个指针:pre,cur,tmp
pre指前一个,cur指后一个,tmp是cur->next调整前的对象
两两交换链表中的节点:
虚拟头节点,需要两个tmp指针
1(cur)->2(tmp1)->3->4(tmp2)
cur->3, 3->2, 2->4 cur = tmp1
删除链表倒数第N个节点:
快慢指针, 快指针先走n步,后保持步速一致直到末尾,
特判删除最后节点,特判删除开头,在释放指针时让tmp->next指向空
链表相交
返回相交的节点。
先统计两个链表长度,对齐后面,然后再以同样速度前进
环形链表
快慢指针,快指针二倍速,慢指针一倍速,两个指针第一次碰,头指针和快指针再碰
数学技巧懂了就没什么了
使用链表模拟加法
同样适用虚拟头节点,再加两个list任意一个时要判断是否为空指针,考虑carry
合并两个排序链表
类似归并排序,最后要记得把
合并K个排序链表
需用虚拟头节点+小顶堆(优先队列)
k个一组反转链表
使用有结束节点(第k+1个节点)的反转链表函数,3个节点(pre,cur,nxt)
递归得到完整链表
拷贝存在随机指针的链表
数据结构的复制永远考虑:哈希表+二次遍历(第一次遍历复制节点,第二遍节点连接)
先把没有指针(next, random都没设置)的节点创造出来,用map,然后再在遍历的时候链接
检查链表是否有环
快慢指针,撞在一起就有环