24. 两两交换链表中的节点
- 可以添加一个虚拟的头节点,从而无需单独处理头节点
- 注意交换的步骤,总共有三步,按顺序执行,此时需要
两个变量来保存交换前的两个结点,一个是交换前排在前面的节点,另一个是交换前排在后面的节点所指向的节点
19.删除链表的倒数第N个节点
先将链表反转,删除节点后再将链表反转
双指针法
- 可以添加一个虚拟的头节点,从而无需单独处理头节点
- 假设让一个指针指向链表末尾的空指针,另一个指针指向删除节点的前一个节点,会发现它们之间的步数恰好等于题目中的
N+1,所以可以使用双指针法,初始时让快指针走N+1步,然后两个指针再同时出发,此时当快指针到达末尾空指针时,慢指针一定到达了要删除节点的前一个节点,便可进行删除操作
160.链表相交
首先,相交的结点代表的是地址相同,而不是两个结点的值相同;如果有相交,两个链表在各自链表的某个结点处的指针移动相同的步数一定能到达相交的结点,求出这个结点的位置则需要知道两个链表的长度,从而得到长度差,让长读长的链表的头指针向前移动长度差的值的步数,移动完后,从此刻起,两个链表的两个指针同时移动,如果有相交的结点,一定会同时到达,从而得出相交的结点
142. 环形链表 II
使用JavaScript中的Set数据结构
遍历链表,将每个结点加入Set结构中,当遍历到某个结点,发现这个结点在Set结构中已存在,说明链表有环且该节点就是链表环的入口处
使用双指针
- 当快指针一次走两步,慢指针一次走一步,两者的步数差为1时,当链表有环时,快指针先进环,而且慢指针还没走完一圈一定会被快指针追上,即两者相遇
- 通过
数学方式证明,详见代码随想录 (programmercarl.com)可知道快慢指针相遇处的节点到入口节点的步数和头节点到入口节点的步数相同
- 因此:
首先,判断快慢指针是否相遇来判断是否有环;其次,记录当前相遇的节点meetIndex和指向头节点的指针headIndex;最后,让meetIndex和headIndex指针同时移动,知道两者相等,此时指向的节点就是入口节点,此题得解