# 题目
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
** 进阶:** 你能尝试使用一趟扫描实现吗?
19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)
# 分析
一眼顶针,双指针,fast 先走 n 然后和 slow 一起走
// 时间复杂度: O (n) | |
// 空间复杂度: O (1) | |
class Solution { | |
public: | |
ListNode* removeNthFromEnd(ListNode* head, int n) { | |
ListNode* dummyHead = new ListNode(0); | |
dummyHead->next = head; | |
ListNode* slow = dummyHead; | |
ListNode* fast = dummyHead; | |
while(n-- && fast != NULL) { | |
fast = fast->next; | |
} | |
fast = fast->next; //fast 再提前走一步,因为需要让 slow 指向删除节点的上一个节点 | |
while (fast != NULL) { | |
fast = fast->next; | |
slow = slow->next; | |
} | |
slow->next = slow->next->next; | |
// ListNode *tmp = slow->next; C++ 释放内存的逻辑 | |
// slow->next = tmp->next; | |
// delete nth; | |
return dummyHead->next; | |
} | |
}; |