24. 两两交换链表中的节点
思路:看了题目后面的题解和自己最开始的想法是一样的,自己对于交换的逻辑和之后的跳转都有大致的思路,主要是更新标杆位置的时候不知道怎么操作,而且也没有想到要定义一个cur来遍历。看完思路后自己也是ac了题目,之后还需要巩固。
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode();
dummy.next = head;
ListNode cur = dummy;
while (cur != null && cur.next != null && cur.next.next != null) {
ListNode f = cur;
ListNode s = f.next;
ListNode t = s.next;
//交换
f.next = t;
s.next = t.next;
t.next = s;
cur = cur.next.next;
}
return dummy.next;
}
}
19.删除链表的倒数第N个节点
思路:用的chat教的双指针思路,自己也理解了,周末可以再手敲一遍
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0); // 创建虚拟头节点
dummy.next = head; // 虚拟头节点指向链表的头节点
ListNode slow = dummy; // 慢指针,初始指向虚拟头节点
ListNode fast = dummy; // 快指针,初始指向虚拟头节点
// 快指针先向前移动 N+1 步
for (int i = 0; i < n + 1; i++) {
fast = fast.next;
}
// 当快指针移动到链表末尾时,慢指针指向要删除的节点的前一个节点
while (fast != null) {
slow = slow.next;
fast = fast.next;
}
// 如果要删除的是链表的头节点,则直接将头节点的下一个节点作为新的头节点
if (slow.next == head) {
return head.next;
}
// 此时,慢指针指向要删除的节点的前一个节点
slow.next = slow.next.next; // 跳过要删除的节点
return dummy.next; // 返回虚拟头节点的下一个节点作为新的链表头
}
面试题 02.07. 链表相交
思路:想到了从后往前遍历。但好像不是很好实现,看了题解,思路非常独特,十分惊叹作者的思路。
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode A = headA, B = headB;
while (A != B) {
A = A != null ? A.next : headB;
B = B != null ? B.next : headA;
}
return A;
}
}
142.环形链表II
思路:周末补上。