题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
示例1
输入
{1,2,3,3,4,4,5}
返回值
{1,2,5}
题解
因为链表是有序的,那么我们可以在遍历链表的同时,检查当前节点与下一点是否为相同值,如果相同,继续查找相同值的最大长度,最后指针改变指向即可。
(1)需要记录前一个结点,当前结点,以及下一个结点;
前一个结点(pre)用来记录前面不重复的所有结点,以便链接到下一个不重复的结点,当前结点(cur)用来取值和下一个结点(cur->next)的值进行对比,看是否重复
(2)由于要返回链表头指针,而可能存在整个链表都是重复的情况,所以先new一个新的结点(vhead),然后让其指向头结点(pHead),最后返回vhead->next
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
ListNode* vhead = new ListNode(-1);
vhead->next = pHead;
ListNode* pre = vhead;
ListNode* cur = pHead;
while(cur){
if(cur->next && cur->val == cur->next->val){
cur = cur->next;
while(cur->next && cur->val == cur->next->val){
cur = cur->next;
}
cur = cur->next;
pre->next = cur;
}
else{
pre = cur;
cur = cur->next;
}
}
return vhead->next;
}
};