链表=双指针=空间鲁棒性 快指针先走n步,当快指针走到null时,慢指针指向倒数第n个。因为遍历一遍,所以用一个int变量记录快指针走了几步,当快指针走的步数大于等于n时,才让慢指针开始走。因为要删除,所以要来一个pre指针记录当前指针的前驱指针,删除操作就是直接让pre指向当前指针的next即可。最后判断,如果快指针在走n步直接走到结尾了,那么证明要删除头结点,直接返回head->next即可,通过判断pre是否为空来看是否是删除头。否则就删除slow指针指向的结点,最后返回head
/**
* 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) {
//给定n有效,就不用判断链表长度什么的了
//链表=双指针=空间鲁棒性
//先通过双指针找到第n个结点,然后将它的前后相连即可,快指针先走n步,慢指针才开始走,快走到尾了,慢就是第n个,在走的过程要时刻时刻记录当前指针的前一个指针方便删除当前指针,当快是null时,慢就是倒数第n个
if(head == nullptr || head->next == nullptr) return nullptr;
ListNode* pre = nullptr;
//head可能要变,因为可能删除的就是头
ListNode* slow = head, *fast = head;
int xianzou = 0;
while(fast != nullptr){
if(xianzou >= n){
pre = slow;
slow = slow->next;
}
fast = fast->next;
xianzou++;
}
//如果前驱指针没有改变,证明在快指针先走n步的时候直接走到链表尾了,证明要删除的就是头结点
if(pre == nullptr) return head->next;
pre->next = slow->next;
return head;
}
};
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/J_avaSmallWhite/article/details/112760918