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

题目描述

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

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.	
当删除了倒数第二个节点后,链表变为 1->2->3->5.

说明:

给定的 n 保证是有效的。

进阶:

你能尝试使用一趟扫描实现吗?

来源:力扣(LeetCode)

思路

双指针,指针A先移动n次, 指针B再开始移动。当A到达null的时候, 指针b的位置正好是倒数n

我们可以设想假设设定了双指针p和q的话,当q指向末尾的NULL,p与q之间相隔的元素个数为n时,那么删除掉p的下一个指针就完成了要求。

设置虚拟节点dummyHead指向head

设定双指针p和q,初始都指向虚拟节点dummyHead

移动q,直到p与q之间相隔的元素个数为n

同时移动p与q,直到q指向的为NULL

将p的下一个节点指向下下个节点

 

关键点解析

  1. 链表这种数据结构的特点和使用

  2. 使用双指针

  3. 使用一个dummyHead简化操作

代码

/*	
 * @lc app=leetcode id=19 lang=javascript	
 *	
 * [19] Remove Nth Node From End of List	
 *	
 * https://leetcode.com/problems/remove-nth-node-from-end-of-list/description/	
 *	
 * algorithms	
 * Medium (34.03%)	
 * Total Accepted:    360.1K	
 * Total Submissions: 1.1M	
 * Testcase Example:  '[1,2,3,4,5]\n2'	
 *	
 * Given a linked list, remove the n-th node from the end of list and return	
 * its head.	
 *	
 * Example:	
 *	
 *	
 * Given linked list: 1->2->3->4->5, and n = 2.	
 *	
 * After removing the second node from the end, the linked list becomes	
 * 1->2->3->5.	
 *	
 *	
 * Note:	
 *	
 * Given n will always be valid.	
 *	
 * Follow up:	
 *	
 * Could you do this in one pass?	
 *	
 */	
/**	
 * Definition for singly-linked list.	
 * function ListNode(val) {	
 *     this.val = val;	
 *     this.next = null;	
 * }	
 */	
/**	
 * @param {ListNode} head	
 * @param {number} n	
 * @return {ListNode}	
 */	
var removeNthFromEnd = function(head, n) {	
  let i = -1;	
  const noop = {	
    next: null	
  };	
  const dummyHead = new ListNode(); // 增加一个dummyHead 简化操作	
  dummyHead.next = head;	
  let currentP1 = dummyHead;	
  let currentP2 = dummyHead;	
  while (currentP1) {	
    if (i === n) {	
      currentP2 = currentP2.next;	
    }	
    if (i !== n) {	
        i++;	
    }	
    currentP1 = currentP1.next;	
  }	
  currentP2.next = ((currentP2 || noop).next || noop).next;	
  return dummyHead.next;	
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值