算法1
注意:删除数组中的重复元素,用的方法是双指针,删除链表中的头结点,原理也是操作两个指针,但是需要设置虚拟头结点
思路:设置两个三个节点,虚拟头结点dummy,p,q,在这里设置虚拟头结点的目的是,有可能出现头结点和后面连续几个重复,需要删掉。
C++ 代码
/**
* 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* deleteDuplicates(ListNode* head) {
auto dummy=new ListNode(-1);//设置一个虚拟头结点,初值为-1
dummy->next=head;
auto p=dummy;//删除重复节点,一般需要两个指针,一个先指向头结点
while(p->next)
{
auto q=p->next;
//当q存在并且q的值和p->next值相同,刚开始写的时候,写成q->val==q->next->val,就会报错,;然后让q向后走
while(q &&q->val==p->next->val)q=q->next;
if(q==p->next->next) p=p->next;//当q为下下个节点,说明不同元素是1,更新p
else p->next=q;//p,q之间有多个点,需要让p指向q
}
return dummy->next;
}
};