(写给未来遗忘的自己)
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode dummy(0); // 使用虚拟头节点来处理头节点删除的情况
dummy.next = head;
ListNode* front_delete_listnode = &dummy;
ListNode* last_listnode = &dummy;
// 将last_listnode指针向前移动n+1步,以便使两个指针之间的差距为n
for (int i = 0; i <= n; ++i) {
last_listnode = last_listnode->next;
}
// 同时移动两个指针,直到last_listnode到达链表末尾
while (last_listnode != nullptr) {
front_delete_listnode = front_delete_listnode->next;
last_listnode = last_listnode->next;
}
// 删除目标节点
ListNode* delete_listnode = front_delete_listnode->next;
front_delete_listnode->next = delete_listnode->next;
delete delete_listnode;
return dummy.next; // 返回新链表的头节点
}
};
注意:(对于链表的处理要学会使用虚拟头,对于好多题都是简单的)
使用虚拟的头节点,如果头节点需要删除,那就和删除后面的没有区别。
删除倒数第n个,就是让一个快速节点和慢节点相距n,那么慢节点的下一个就是需要删除的节点。