这是我参与11月更文挑战的第26天,活动详情查看:2021最后一次更文挑战
删除链表的倒数第N个结点
Hot100 19.删除链表的倒数第N个结点
难度:中等
给你一个链表,删除链表的倒数第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]
示例4:
输入:head = [1,3,4], n = 2
输出:[1,4]
提示:
- 链表中结点的数目为
sz 1 <= sz <= 300 <= Node.val <= 1001 <= n <= sz
进阶: 你能尝试使用一趟扫描实现吗?
题解
法一 暴力解法
获取到链表的长度,并删除从链表开头数起的第(L-n+1)个节点即可。
/**
* 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) {
const dummy = new ListNode(0,head);
const len = getLength(head);
let cur = dummy;
for(let i = 1; i < length - n + 1; i++){
cur = cur.next;
}
cur.next = cur.next.next;
const res = dummy.next;
return res;
};
function getLength(head) {
let length = 0;
while(head){
length++;
head = head.next;
}
return length;
}
时间复杂度:O(n)
空间复杂度:O(1)
法二 快慢指针
需要找到倒数第n个节点,可以使用两个指针first和second(初始时均指向头节点)同时对链表进行遍历,并且first比second超前n个节点。当first遍历到链表的末尾(遍历到NULL)时,second的下一个节点就恰好处于倒数第n个节点。
/**
* 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) {
const dummy = new ListNode(0, head);
let first = dummy;
let second = dummy;
for(let i = 0; i < n; i++){
first = first.next;
}
while(first.next){
first = first.next;
second = second.next;
}
second.next = second.next.next;
return dummy.next;
};
时间复杂度:O(n)
空间复杂度:O(1)
坚持每日一练!前端小萌新一枚,希望能点个赞+在看哇~