1、双指针
为了方便删除节点,我们可以使用两个指针用快慢不同的速度进行行走。其中右指针可以先走n步,左指针再进行移动。这样当右指针为空时,我们就可以确保左指针指向待删除节点的上一个节点,从而可以直接进行删除。
同时,为了方便处理,我们可以给链表设置一个虚拟的冗余头节点,这样做的目的是为了当我们删除的节点是头节点时,可以采用和别的别的节点一样的处理方法,从而优化代码。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *dummyHead = new ListNode(0, head);
ListNode *left = dummyHead;
ListNode *right = head;
int times = 1;
if (head->next == nullptr) {
return nullptr;
} else {
while (right != NULL) {
right = right->next;
if (times > n) {
left = left->next;
}
++times;
}
left->next = left->next->next;
return dummyHead->next;
}
}
};