使用的是双指针
定义左指针left和右指针right,初始都先指向头结点的前一个结点(哨兵节点),然后先将right指针向后移动n的距离,这样当right指针遍历到尾节点时,left指针恰好处于right指针后n个位置,也就是倒数第n个节点。
到达目标位置之后,先将需要删除的节点保存在一个临时变量中,避免内存泄漏,再将上一个节点的指向改为当前节点的下一个节点,最后delete当前节点,并返回头节点
1ListNode* removeNthFromEnd(ListNode* head, int n)
2 {
3 ListNode dummyNode(0, head);
4 ListNode* left = &dummyNode;
5 ListNode* right = &dummyNode;
6 for(int i = 0; i < n; i++)
7 {
8 right = right->next;
9 }
10
11 while(right->next != nullptr)
12 {
13 right = right->next;
14 left = left->next;
15 }
16 auto temp = left->next;
17 left->next = left->next->next;
18 delete temp;
19 return dummyNode.next;
20 }