19. 删除链表的倒数第 N 个结点(Leetcode刷题 快慢双指针法)
题目
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
示例
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
输入:head = [1], n = 1
输出:[]
输入:head = [1,2], n = 1
输出:[1]
解题思路
快慢指针,快指针先走n步,然后快慢一起走,直到快指针走到最后,要注意的是可能是要删除第一个节点,这个时候可以直接返回head -> next
解题代码
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
//快指针是从head->next开始的,从head开始,则慢指针需要prev的信息
ListNode* fast_node=head->next;
ListNode* slow_node=head;
//如果说链表为空,或者链表只有一个结点,则返回空
if(!head || !head->next) return NULL;
//否则,快指针先走n步
for(int i =0;i<n;i++){
//在快指针走的过程中,需要判断其是否为空
//如果说快指针为空,那么该链表其实就是要删除第一个结点
//直接返回head->next即可
if(!fast_node) return head->next;
fast_node=fast_node->next;
}
//如果说快指针成功走了n步
//此时快慢指针一起走,直到快指针到达链表的末尾
while(fast_node){
fast_node=fast_node->next;
slow_node=slow_node->next;
}
//此时,慢指针的下一个结点要被删除
slow_node->next=slow_node->next->next;
//最后返回链表的起始结点
return head;
}
};
代码执行效率
执行用时:4 ms, 在所有 C++ 提交中击败了81.80%的用户 内存消耗:10.3 MB, 在所有 C++
提交中击败了90.18%的用户