题意:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
思路:
- 删除倒数第n个节点,那么可以想我们删除的时候就从末尾开始数,但链表不像数组都有下标索引,所以我们可以采用双指针的办法
- 定义一个快指针fast和一个慢指针slow,让快指针先遍历链表n+1步,此时slow指针开始从头节点进行遍历,则快指针始终比慢指针的索引大n+1,且当快指针fast指向末尾null时,slow指针此时指向被删除的节点的前一个元素。通过slow.next=slow.next.next删除
var removeNthFromEnd = function(head, n) {
let dummy = new ListNode()//创建虚拟头节点
dummy.next = head
let fast = dummy
let slow = dummy
for(let i=0;i<=n;i++){
fast = fast.next
}
while(fast != null){
fast = fast.next
slow = slow.next
}
slow.next = slow.next.next
return dummy.next
};