在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
如果发现 当前节点和下一节点值相等,即为重复的节点,一直找到不重复为止。
如果是 当前节点还是,头节点,直接对头结点操作
否则,对pre 节点操作,
注意,无论重复不重复,要对当前节点更新。更新的方式稍有不同。
参考:
https://www.nowcoder.com/profile/8032527/codeBookDetail?submissionId=14905027
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if (pHead==nullptr)return pHead;
ListNode * pre = NULL;
ListNode* p = pHead;
ListNode* q = NULL;
while(p)
{
if (p->next && (p->val == p->next->val))
{
q = p->next;
while( q && q->next && q->next->val == p->val)
{
q = q->next;
}
if (p==pHead)
{
pHead = q->next; // !!!
}
else {
pre->next = q->next;
}
p = q->next; // !!!
}
else{
pre = p;
p = p->next;
}
}
return pHead;
}
};