4.8刷题记录(双指针)
今天刷的部分是代码随想录中的双指针专题代码随想录
由于里面包含的题目大部分之前刷过,并且用双指针做过。所以今天仅仅复习,不再进行代码的搬运。
1.19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)
分析:此题无非就是找到哪个点,然后将其删除即可。所以最大的难度在于如何找到那个点。接下来提供两种思路,第一种两次遍历,找到要删除的前一个。第二个通过双指针,先通过fast找到m位置,slow找到0位置。然后二者同时走n-m个位置,判断条件为fast走向了n即末尾的位置。这时候slow指向的就是n-m即倒数m的位置。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
//0.增加一个头节点
ListNode dimmy=ListNode(0,head);
//1.首先遍历
ListNode*p=head;
int count=0;
while(p){
count++;
p=p->next;
}
//2.进行划分,找到前驱节点
count=count-n;
p=&dimmy;
while(count>0){
count--;
p=p->next;
}
//3.进行删除
//此时p为前驱节点
ListNode *temp=p->next;
p->next=temp->next;
delete(temp);
return dimmy.next;
}
};
//方法二
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
//0.增加一个头节点
ListNode dimmy=ListNode(0,head);
//1.初始化双指针
ListNode*fast=&dimmy;
ListNode*slow=&dimmy;
//2.fast先走n个位置
while(n>0&&fast&&fast->next){
fast=fast->next;
n--;
}
// fast=fast->next;
//3.然后二者一起继续走
while(fast&&fast->next){
fast=fast->next;
slow=slow->next;
}
//4.删除结点
slow->next=slow->next->next;
//5.输出
return dimmy.next;
}
};