leetcode/src/s0019_remove_nth_node_from_...

29 lines
966 B
C++

#include "s0019_remove_nth_node_from_end_of_list.hpp"
// 思路一:遍历两次,第一次遍历得到总长度,第二次遍历找出倒数第 n 个
// 思路二:栈,先进后出,全部入栈后弹出倒数第 n 个把它舍弃掉
// 思路三:双指针,快指针比慢指针多走 n
// 步,等快指针走到头时,慢指针指向的的就是倒数第 n 个
// 双指针实现
ListNode* S0019::removeNthFromEnd(ListNode* head, int n) {
// 一种常见的处理头指针的方法是添加一个哑指针,这个哑指针指向头指针
// 这样我们就不需要单独讨论头指针了。
ListNode dummy(0, head);
ListNode* fast = &dummy;
for (int i{0}; i < n; i++) {
if (fast == nullptr) {
return nullptr;
} else {
fast = fast->next;
}
}
ListNode* slow = &dummy;
while (fast->next != nullptr) {
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
return dummy.next;
}