问题描述:
- 给定一个链表,删除链表的倒数第
n
个结点,并且返回链表的头结点。
核心思路:
- 链表的解题通常很固定:哨兵节点、双指针、递归。
- 该题步骤如下:
- 在链表前边添加一个哨兵节点
pivot
(即 pivot->next = root
)。【可不添加,但要处理边界较麻烦】 - 双指针
slow
、fast
置为 pivot
。【即双指针从哨兵指针开始移动】 fast
指针先移动 n
步。【不会越界】- 接着
slow
和 fast
同时步进直到 fast
走到尾部。【此时 slow
位于需要删除节点的前一个位置上】 - 将
slow
指向的下一个节点断开,即 slow->next = slow->next->next
。 - 最后返回哨兵的下一个节点即可。【即头节点】
代码实现:
class Solution
{
public:
ListNode* removeNthFromEnd(ListNode* head, int n)
{
ListNode* pivot = new ListNode(0, head);
ListNode* slow = pivot;
ListNode* fast = slow;
while(n-- > 0)
fast = fast->next;
while(fast->next)
slow = slow->next, fast = fast->next;
slow->next = slow->next->next;
return pivot->next;
}
};