82. 删除排序链表中的重复元素 II
思路:预定一个preHead指向head
如果发现我的next->val==next->next->val
那派出个快指针去找不重复的位置,preHead指向它,再次进行判断,如果符合标准,那么做指针指向这个节点
第一次写的成坨的代码
/*
思路:预定一个preHead指向head
如果发现我的next->val==next->next->val
那派出个快指针去找不重复的位置,preHead指向它,再次进行判断,如果符合标准,那么做指针指向这个节点
*/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode preHead(0);
preHead.next = head;
ListNode* pleft = &preHead;
ListNode* pright = pleft;
while (pleft->next != NULL && pleft->next->next != NULL)
{//找它后面两个
if (pleft->next->val == pleft->next->next->val)
{ //如果这俩相等的话,跳过这些相等的
pright = pleft->next->next->next;
while (pright != NULL)
{
if (pright->val != pleft->next->val)
{
break;
}
pright = pright->next;
}
pleft->next = pright;
}
else {
pleft = pleft->next;
}
}
return preHead.next;
}
};
改进一下发现可以直接弄成两个相邻的节点做判断,如果右节点的next和他的next一样那么又节点就跑起来了
将pright利用起来,他负责指向pleft后面的一个节点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode preHead(0);
preHead.next = head;
ListNode* pleft = &preHead;
ListNode* pright = pleft->next;//直接指定相邻的节点
while (pleft->next != NULL && pright->next != NULL)
{
if (pleft->next->val == pright->next->val)
{ //如果这俩相等的话,跳过这些相等的
while (pright->next != NULL)
{
if (pright->next->val != pleft->next->val)
{ //找到了下一个不相同的节点了
break;
}
pright = pright->next;
}
pleft->next = pright->next;
}
else {
pleft = pleft->next;
}
//找它后面两个
pright = pleft->next;
}
return preHead.next;
}
};