题目
给定一个链表,删除倒数第 N 个节点。并返回链表头。
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
原题链接: https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
思路
可以直接遍历一次链表,统计链表长度 L,那么 L - N 就是顺数的要删除的节点。再重新遍历一次,走到该节点前面的一个节点,将其删除即可。
也可以采用快慢指针,快指针先走 N 步,然后快慢指针再一起走,知道快指针走到链表最后一个节点为止。此时慢指针指向要删除节点的前一个节点。然后进行删除操作即可。
- 复杂度分析
- 时间复杂度 O(n)。
- 空间复杂度 O(1)。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if (head == NULL) {
return head;
}
ListNode* preHead = new ListNode();
preHead->next = head;
ListNode* fast = preHead;
ListNode* slow = preHead;
while(n > 0 && fast) {
n--;
fast = fast->next;
}
if (fast == NULL) {
return head;
}
while(fast->next) {
slow = slow->next;
fast = fast->next;
}
slow->next = slow->next->next;
return preHead->next;
}
};