持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情
今天讲解的是链表系列的1道题:
- 删除链表的倒数第 N 个结点
19. 删除链表的倒数第 N 个结点
leetcode地址:leetcode.cn/problems/re…
难度
中等
描述
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
提示:
链表中结点的数目为 sz 1 <= sz <= 30 0 <= Node.val <= 100 1 <= n <= sz
解法
1.采用双指针遍历的方法
2.定义虚拟头节点dummyHead,指向链表的头节点
3.定义两个指针,分别为慢指针p和快指针q,两个初始值都是虚拟头节点dummyHead
4.首先将快指针移动n步,也就是在循环中,使得 q = q.next
5.接着双指针一起往后移动,直到q.next === null,此时p.next就是要删除的结点
6.定义要删除的节点delNode,值为p.next
7.将delNode几点删除,就是将节点p指向delNode的下一个节点,也就是p.next = delNode.next
8.最后返回虚拟头节点的下一个节点,就是dummyHead.next,表示链表的真实头节点
9.注意特例判断:如果n和链表中总结点个数相同,即要删除的是链表头结点,此时直接返回head.next即可
代码
/*
* @lc app=leetcode.cn id=19 lang=javascript
*
* [19] 删除链表的倒数第 N 个结点
*/
// @lc code=start
/**
* 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 dummyHead = new ListNode(0)
dummyHead.next = head;
let p = dummyHead;
let q = dummyHead;
for(let i = 0;i<n+1;i++){
q = q.next;
}
// 移动p,q
while(q){
p = p.next;
q= q.next;
}
// 删除节点
let delNode = p.next;
p.next = delNode.next;
return dummyHead.next;
};
// @lc code=end