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

tech2022-12-30  109

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

难度中等

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

示例:

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

说明:

给定的 n 保证是有效的。

进阶:

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


思考:

1.只能遍历一遍,却要做遍历两边才可以做到的事,用双指针。

2.为了删除节点方便,在头部引入dummy节点(哑结点)。因为删除一个元素,需要指针指向它的前一个元素,在第一个节点之前加入dummy,操作更方便一点。

3.删除倒数第二个节点,我们让n2先指向第二个节点。然后和n1一起向后移动,n2到链表尾部的时候,n1也正好到被删除节点的前一位。

所以删除倒数第n个,n2就先移动n个位置。知道次数,用for循环。

然后再和n1一起遍历到链表的末端。因为不知道链表长度,所以用while。

4.最后返还的是dummy->next的头部指针哦。 

 


 代码实现:

/** * 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 dummy = new ListNode(); dummy.next = head; let n1 = dummy; let n2 = dummy; for(let i=0; i<n; i++) { n2 = n2.next; } while (n2.next) { n1 = n1.next; n2 = n2.next; } n1.next = n1.next.next; return dummy.next; };

知识:

1.哑结点在删除链表节点的时候,很方便哦。


复习:

9.10:这题思路记得比较清晰,dummy节点很重要

最新回复(0)