【一天一大 lee】删除链表的倒数第N个节点 (难度:中等) - Day20201018

264 阅读2分钟

题目:

给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

抛砖引玉

思路:

计算链表总长度,倒数第 N 个节点就是第 len-n 个节点

在链表头部增加一个哑节点(dummy node),来方便处理删除节点 1 的情况

0->1->2->3->4->5
抛砖引玉
抛砖引玉
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function(head, n) {
  let _result = new ListNode(0, head),
    node = _result,
    len = 0,
    index = 0

  while (head) {
    len++
    head = head.next
  }
  // 更新node指针到len-n位置
  for (let i = 1; i < len - n + 1; i++) {
    node = node.next
  }
  // 跳过le-n位置的节点之间连接其next上的节点完成删除
  node.next = node.next ? node.next.next : null
  return _result.next
}

一次遍历

声明两个指针中间差 n 步,那么前面的指针到链表尾部时,后面的指针就刚好在倒数第 n 的位置上

var removeNthFromEnd = function(head, n) {
  let _result = new ListNode(0, head),
    start = _result,
    end = head,
    index = 0

  while (index < n) {
    end = end.next
    index++
  }
  while (end !== null) {
    end = end.next
    start = start.next
  }
  start.next = start.next.next
  return _result.next
}

博客: 前端小书童

每天的每日一题,写的题解会同步更新到公众号一天一大 lee 栏目 欢迎关注留言

公众号:前端小书童