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节点很重要