打卡-算法训练营-Day4 | 24. 两两交换链表中的节点;19.删除链表的倒数第N个节点

56 阅读1分钟

两两交换链表中的节点

leetcode链接:leetcode.cn/problems/sw…

涉及到链表的都先画图,再写代码:

image.png

为什么需要一个临时指针变量?

因为cur.next指向新节点后,就获取不到原来的cur.next节点了

要注意,步骤1中的的cur.next.next在步骤2中变成了cur.next

var swapPairs = function(head) {
    let dummy = new ListNode(0, head);
    let cur = dummy;
    while (cur.next && cur.next.next) {
        // 步骤1
        let temp = cur.next;
        cur.next = cur.next.next;

        // 步骤2
        temp.next = cur.next.next;
        cur.next.next = temp;

        cur = temp;
    }
    return dummy.next;
};

删除链表的倒数第N个节点

leetcode链接:leetcode.cn/problems/re…

这道题目可以使用两种方法来解,推荐学习和使用双指针

方法一:双指针

如何找到第n个节点?

快指针先移动n步,然后快慢指针一起移动,直到快指针指向了空节点,此时慢指针就指向了要删除的节点

但此时有个问题,如果要删除第n个节点,肯定需要知道被删除节点的前一个节点,为了让慢指针指向被删除节点的前一个节点,快指针需要走n+1

var removeNthFromEnd = function(head, n) {
    let dummy = new ListNode(0, head);
    let slow = dummy;
    let fast = dummy;

    // 快指针走n+1步
    n++;
    while (n-- && fast) {
        fast = fast.next;
    }

    // 快慢指针一起移动,直到快指针指向空节点
    while (fast) {
        fast = fast.next;
        slow = slow.next;
    }

    // 删除节点
    slow.next = slow.next.next;

    return dummy.next;
};
方法二:模拟

删除倒数第n个,那就是删除正数第size-n+1个

首先获取链表的长度:

    // 获取链表的长度
    let size = 0;
    let temp = head;
    while (temp) {
        size++;
        temp = temp.next;
    }

然后遍历链表,使得cur指针指向要删除节点的前一个节点:

    let dummy = new ListNode(0, head);
    let cur = dummy;
    let i = 0;

    while (cur && cur.next) {
        i++;
        if (i === (size - n + 1)) {
            cur.next = cur.next.next;
        }
        cur = cur.next;
    }

最后,返回dummy.next