解法一:栈
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummy = new ListNode(0, head);
ListNode* cur = dummy;
stack<ListNode*> s;
while (cur) { // 入栈
s.push(cur);
cur = cur->next;
}
for (int i = 0; i < n; i++) { // 出栈
s.pop();
}
// 此时要删除的元素正好刚出去,栈顶元素就是要删除的前一个元素
ListNode* temp = s.top();
temp->next = temp->next->next;
ListNode* ret = dummy->next;
delete dummy;
return ret;
}
};
解法二:快慢指针
// 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
// 快慢指针,快指针先遍历n个,然后快慢指针一起遍历,最后慢指针指向next就是要删除的
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummy = new ListNode(0, head);
ListNode* fast = head;
ListNode* slow = dummy;
for (int i = 0; i < n; i++) {
fast = fast->next;
}
while (fast) {
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
ListNode* ret = dummy->next;
delete dummy;
return ret;
}
};