LeetCode 19
DummyNode的使用
为了避免单独讨论头结点这种情况我们一般用虚拟节点指向头结点。
ListNode* DummyNode(0);
DummyNode->next=head;
双指针
定义两个指针front 和behind
ListNode* front=DummyNode;
ListNode* behind=DummyNode;
此时让front先走,我们要让Front比behind多走n个位置,这样当他们一起走的时候,behind刚好在倒数第N个节点的前面,而front正好为空。因为DummyNode是0的位置,所以我们要让front走到n;
for(int i=0;i<n+1;i++)
front=front->next;
之后同时走(走到如图的情况停下)
while(front){
front=front->next;
behind=behind->next;
}
我们此时的behind指的是倒数第n个节点的上一个节点。所以要删除的节点为
进行删除操作
ListNode* delNode=behind->next;
behind->next=delNode->next;
delete delNode;
最后因为要我们返回一个删除后的,所以我们要返回DummyNode->next;并且delete DummyNode;
ListNode* resNode=DummyNode->next;
delete DummyNode;
最后 resNode就是我们想要的结果了。
总结
双指针要灵活使用,并且虚拟节点也是链表题的套路,要熟练使用