需要返回改变后的链表,那肯定要先弄一个头节点啦
上面这个论调错误,只是要处理下删除头节点的情况,见第二段代码
fast指针先走n步,然后slow和fast一起走,直到fast到最后一个节点
重点(重新再次写这一题的时候,再次在这里栽倒,人果然会重复犯错
注意判断最后fast跳出的条件即可,需要fast指向最后一个节点,那就需要判断fast.next
var removeNthFromEnd = function (head, n) {
let dummy = new ListNode(-1)
dummy.next = head
let slow = dummy, fast = dummy
while (n--) {
fast = fast.next
}
while (fast.next) {
fast = fast.next
slow = slow.next
}
slow.next = slow.next.next
return dummy.next
};
如果链表长3,但是n=3,那么此时要删除的就是头节点
此时直接判断fast是否为空,为空直接返回head.next
var removeNthFromEnd = function (head, n) {
let slow = head, fast = head;
// 让 fast 指针先向前移动 n 步
while (n--) {
fast = fast.next;
}
// 如果 fast 为空,说明要删除的是头节点
if (!fast) {
return head.next;
}
// 继续移动 fast 和 slow,直到 fast 到达链表末尾
while (fast.next) {
fast = fast.next;
slow = slow.next;
}
// 此时 slow 指向要删除节点的前一个节点
slow.next = slow.next.next;
return head;
};