【Leetcode】19.删除链表的倒数第 N 个结点(倒数第k个节点)

42 阅读1分钟

leetcode-19.png

需要返回改变后的链表,那肯定要先弄一个头节点啦
上面这个论调错误,只是要处理下删除头节点的情况,见第二段代码

fast指针先走n步,然后slowfast一起走,直到fast到最后一个节点

重点(重新再次写这一题的时候,再次在这里栽倒,人果然会重复犯错
注意判断最后fast跳出的条件即可,需要fast指向最后一个节点,那就需要判断fast.next

var removeNthFromEnd = function (head, n) {
  let dummy = new ListNode(-1)
  dummy.next = head
  let slow = dummy, fast = dummy
  while (n--) {
    fast = fast.next
  }
  while (fast.next) {
    fast = fast.next
    slow = slow.next
  }
  slow.next = slow.next.next
  return dummy.next
};

如果链表长3,但是n=3,那么此时要删除的就是头节点
此时直接判断fast是否为空,为空直接返回head.next

var removeNthFromEnd = function (head, n) {
    let slow = head, fast = head;
    // 让 fast 指针先向前移动 n 步
    while (n--) {
        fast = fast.next;
    }
    // 如果 fast 为空,说明要删除的是头节点
    if (!fast) {
        return head.next;
    }
    // 继续移动 fast 和 slow,直到 fast 到达链表末尾
    while (fast.next) {
        fast = fast.next;
        slow = slow.next;
    }
    // 此时 slow 指向要删除节点的前一个节点
    slow.next = slow.next.next;
    return head;
};