设计官网首页长沙优化网站
今天刷的部分是代码随想录中的双指针专题代码随想录
由于里面包含的题目大部分之前刷过,并且用双指针做过。所以今天仅仅复习,不再进行代码的搬运。
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;}
};