节点定义ListNode包含data值val,指针next
为什么要用进行cur=vrNode赋值且返回的是vrNode.next?
因为进行操作完,链表已经发生改变且cur值在进行操作已经发生改变,而vrNode.next一直是头节点
为什么要用虚拟头节点?
这样方便处理删除实际头结点的逻辑
什么时候用虚拟头节点?
虚拟头节点一般用于删除元素用的,用来处理头节点删除逻辑
203.删除链表元素
思路:构造虚拟头节点来处理第一位头节点 就无需处理头节点是目标值以及头节点后面连续是目标值,遍历链表找到删除元素,pre.next = cur.next;
206.反转链表
思路:三个指针,pre=null,cur=head,temp(先保存cur指针调转前指向的节点)
707.设计链表
思路:虚拟头节点遍历找到前驱节点指向获取元素以及删除元素
24.两两交换链表节点(建议使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。)
思路:三步走,遍历链表 保存两节点交换下一个连接节点(临时节点) 虚拟头节点指向第二个节点 第二个节点指向第一个节点 第一个节点指向临时节点 同理后续交换
19.删除链表的倒数第n个节点
思路:快慢指针,采用虚拟头节点,快指针先走n+1步,后续快慢指针一起走,当快指针为null时,要删除的节点为慢指针的下一个节点
160.相交节点
思路:计算两个链表长度,计算差值,长链表先移动到后续元素与短链表同样长度位置再一起走直到节点为null,当节点值相同为相交节点
142.环形链表
思路:
-
如何判断有环
快慢指针 从头节点出发 fast指针走两步 慢指针走一步 如果相遇就证明有环
-
如果有环如何找到这个环的入口
当相遇后从头节点再出发一个节点 相遇节点出发一个节点 两个节点相遇就为环入口