文档讲解:代码随想录(https://www.programmercarl.com/)
依然是补打卡! 追!😭
- 24. 两两交换链表中的节点
思路分析:画了图,如下
class Solution {
public ListNode swapPairs(ListNode head) {
// 初始化一个虚拟头节点 指向头节点
ListNode dummyHead = new ListNode(0); // 初始值为0
dummyHead.next = head;
// 定义一个临时头节点
ListNode cur = dummyHead;
while(cur.next != null && cur.next.next != null) {
// 临时保存好当前节点的下一个节点,以防错乱。后面要操作此节点
ListNode temp = cur.next;
ListNode temp1 = cur.next.next.next; // 头节点的下两个节点cur.next.next.next
cur.next = cur.next.next;// 跳过头节点
cur.next.next = temp;
temp.next = temp1;
cur = cur.next.next;
}
return dummyHead.next;
}
}
-
- 删除链表的倒数第N个节点
思路分析:如下图
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
// 虚拟头节点 并指向头节点head
ListNode dummyHead = new ListNode(0, head);
// 快慢指针
ListNode slow = dummyHead;
ListNode fast = dummyHead;
// 快指针先走n步
for(int i = 0; i < n; i++) {
fast = fast.next;
}
// 同时移动快慢指针 fast不能指向空
while(fast.next != null) {
slow = slow.next;
fast = fast.next;
}
// 此时slow指针的位置就是要删除的元素
slow.next = slow.next.next;
return dummyHead.next;
}
}
- 07.链表相交
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
//双指针法
//A链表从头节点出发,到达链表的末尾null,就到链表B的头节点重新开始;
//B链表从头节点出发,到达链表的末尾null,就到链表A的头节点重新开始;
//最后两个指针相遇就是相交的地方
//链表AB从相交节点开始,后面的部分是相同的节点,如果假设A链表的长度为a,B链表的长度为b,相交节点后的长度为c,那么
//A 链表走的距离就是,a+c+b
//B 链表走的距离就是,b+c+a
//可以看到,AB链表走的距离是一样的
ListNode A = headA;
ListNode B = headB;
while (A != B) {
A = A == null ? headB : A.next;//A 为空,跳到B的头节点,走B的路
B = B == null ? headA : B.next;//B 为空,跳到A的头节点,走A的路
}
//直到跳出循环了,说明,A和B相等了
return A;
}
}
- 142.环形链表||
思路分析:首先要判断是否有环,即判断快慢指针是否相等fast==slow;经过数学推理,得到:双指针 快慢指针 数学推理出在相遇后 再分别定义两个指针,一个从头节点出发,一个从相遇节点出发,只要两个指针不相等,就走下去,两个指针碰面,即是入口处的节点
public class Solution {
public ListNode detectCycle(ListNode head) {
// 定义快慢指针
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;// 多走一步
if(slow == fast) {// 说明有环
ListNode index1 = head; // 指针1从头节点开始
ListNode index2 = fast; // 指针2从相遇节点开始
while(index1 != index2) {
index1 = index1.next;
index2 = index2.next;
}
return index2; // 返回相遇的节点就是入口节点
}
}
return null;
}
}
链表这一块,基本都是单链表下的双指针的解法。