思路:
- 定义一个虚拟节点
dummy
,并将其指向链表的头部。 - 定义一个指针
cur
,初始时指向虚拟节点dummy
。 - 进入循环,循环条件是当前节点的下一个节点和下下个节点都不为空。
- 在循环中,定义两个临时指针
temp1
和temp2
,分别指向当前节点的下一个节点和下下个节点的下一个节点。 - 进行节点交换操作:
- 将当前节点的下一个指针指向下下个节点。
- 将下一个节点的下一个指针指向当前节点。
- 将当前节点的下一个节点的下一个指针指向临时指针
temp2
。
- 更新指针
cur
,使其指向交换后的新的当前节点,即下下个节点。 - 循环结束后,返回虚拟节点
dummy
的下一个节点作为新的链表头部。
总体来说,这个算法通过改变节点之间的指针连接顺序,将链表中相邻的两个节点进行交换。通过一个虚拟节点 dummy
辅助操作,可以简化对头节点的处理,最终返回交换后的链表头部。
思路:
- 定义一个虚拟节点
dummy
,并将其指向链表的头部。 - 定义两个指针
fast
和slow
,初始时都指向虚拟节点dummy
。 - 增加
n
的值,这是因为要删除倒数第n
个节点,需要让slow
指针指向待删除节点的前一个节点,而不是待删除节点本身。 - 进行第一个 while 循环,循环条件是
n
大于等于 0 并且fast
不为空。- 在循环中,将
fast
指针向前移动,直到n
的值减为 0 或者fast
为空。
- 在循环中,将
- 进行第二个 while 循环,循环条件是
fast
不为空。- 在循环中,将
fast
和slow
指针同时向前移动,直到fast
为空。 - 这样做的目的是将
slow
指针移动到待删除节点的前一个节点。
- 在循环中,将
- 修改指针连接,将
slow
的下一个节点指向待删除节点的下一个节点,即跳过了待删除节点。 - 返回虚拟节点
dummy
的下一个节点作为新的链表头部。
总体来说,这个算法使用快慢指针的思想,在一次遍历中找到待删除节点的前一个节点,并进行删除操作。通过使用虚拟节点 dummy
辅助操作,可以简化对头节点的处理。最终返回删除倒数第 n
个节点后的链表头部。
题目:面试题 链表相交
思路:
- 定义两个指针
l
和s
,分别用于指向两个输入链表headA
和headB
。 - 计算链表
headA
和headB
的长度分别为lenA
和lenB
。 - 比较
lenA
和lenB
的大小,找出较长链表,并计算长度差,赋值给变量gap
。 - 根据长度差,将指针
l
指向较长链表的头部,将指针s
指向较短链表的头部。 - 使用
while
循环将指针l
向后移动gap
个节点,使得l
和s
位于相同长度的位置上。 - 使用另一个
while
循环,同时遍历链表l
和s
,直到其中一个指针到达链表末尾。- 在循环中,比较当前
l
和s
指针指向的节点是否相同。 - 如果相同,则找到了交点,返回该节点。
- 如果不相同,则继续将两个指针向后移动一个节点。
- 在循环中,比较当前
- 如果没有找到交点,即循环结束后仍未返回,说明两个链表没有交点,返回
NULL
。
总体来说,这个算法通过计算链表长度和移动指针的方式,找到两个链表的交点。通过比较指针指向的节点来确定是否存在交点,并返回交点所在的节点
这题还是不会