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]

提示:

链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz

方法:双指针

思路:新建dummy节点指向head,指针n1、n2指向head,循环n2指针到n的位置,然后再同时移动n1、n2直到结尾,n1、n2的距离是n,此时n1的位置就是需要删除元素的位置

时间复杂度:O(n),n是链表长度

空间复杂度:O(1)

 1 /**
 2  * Defination for singly-linked list
 3  * function ListNode(val,next){
 4  * this.val=(val===undefined?0:val)
 5  * this.next=(next===undefined?null:next)
 6  * }
 7  */
 8 /**
 9  * @param {ListNode} head
10  * @param {number} n
11  * @return {ListNode}
12  */
13 var removeNthFromEnd = function(head, n) {
14     let dummy = new ListNode();
15     dummy.next = head;
16     let n1 = dummy;
17     let n2 = dummy;
18     for (let i = 0; i <= n; i++) { //n2移动n+1次
19         n2 = n2.next;
20     }
21     while (n2 !== null) { //同时移动n1、n2
22         n1 = n1.next;
23         n2 = n2.next;
24     }
25     n1.next = n1.next.next; //删除元素
26     return dummy.next;
27 }
posted @ 2022-11-02 15:22  icyyyy  阅读(83)  评论(0)    收藏  举报