leetcode原题
解题思路
- 根据题意可得,如果链表只有一个节点,那么此时
n 必然等于 1,那么删除倒数第一个节点之后的链表为空,所以特判如果链表只有一个节点,直接返回 null 即可
- 创建虚拟头节点,因为本题删除的节点有可能是头节点,所以创建虚拟头节点可以方便我们的操作,简化处理逻辑
- 定义三个指针
pre 指向虚拟头,target、next 指向 head
- 将
next 指针向后走 n 步
pre、target、next 一起向后走,直到 next 指向 null,此时 target 指向倒数第 n 个节点
- 将
pre 指针指向元素(也就是 target 前一个元素)的 next 指针指向 target.next 来达到从链表中删除 target 节点的目的
- 返回虚拟头节点的下一个节点即可
var removeNthFromEnd = function(head, n) {
// 如果链表只有一个节点,则 n 必然为1,此时删除倒数第一个节点后链表为空
if(head.next === null) return null
// 创建虚拟头节点
const vhead = new ListNode(0)
vhead.next = head
// 定义三个指针
let pre = vhead,
target = head,
next = head
// next向后走n步
while(n){
n--
next = next.next
}
// 当next不为空的时候,三个指针一起向后走
while(next){
pre = pre.next
target = target.next
next = next.next
}
// 此时target指向的就是倒数第n个节点
// 通过将pre.next指向target.next的方法从链表中删除target
pre.next = target.next
return vhead.next
}