双指针(数组)
目录
int k=0;
for(int i=0;i<numsSize;i++)
{
if(nums[k]!=nums[i])
{
k++;
nums[k]=nums[i];
}
}
return k+1;
int k=1;
for(int i=1;i<numsSize;i++)
{
if(nums[i]!=nums[i-1])
{
nums[k]=nums[i];
k++;
}
}
return k;
单指针(链表)
if(head==NULL)
return NULL;
struct ListNode *p=head;
while(p->next!=NULL)
{
if(p->val!=p->next->val)
p=p->next;
else
p->next=p->next->next;
}
return head;
工作指针P从头遍历,与现在所指相同则从头结点删除下一个结点,不同P指针下移。
双指针(链表)
与数组双指针同理。相同则F下移,不同则删掉F和S指针中间结点。与单指针逻辑相反
if(head==NULL)
return NULL;
struct ListNode *fast=head;
struct ListNode *slow=head;
while(fast!=NULL)
{
if(fast->val!=slow->val)
{
slow->next=fast;
slow=slow->next;
}
fast=fast->next;
}
slow->next=NULL;
return head;
PS: 遍历至最后两个结点,如果最后两个结点不同,则顺利结束,反之,则最后两个结点重复,并未去除重复结点。(if语句中,相同逻辑后面必须要接上不同逻辑)
尾插法
每次工作结点都和新链表的尾结点比较,重复则下一个,不重复则尾插。