题目:删除链表的倒数第 N 个结点

使用的是双指针

定义左指针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    }