1、题目说明
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字;
示例1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例2:
输入: 1->1->1->2->3
输出: 2->3
2、思路
1.定义两个指针p(前指针)和q(后指针)来操作原来的链表
2.由于p和q指针是需要移动的,所以要创建一个新的节点来当做临时的头结点(tmpNode),最后返回的时候返回tmpNode->next就可以
3.遇到有重复的节点,需要在while循环中移动q指针,直到q->val 不等于 q->next->val
4.判断q指针是否移动,如果移动过,说明有过重复的节点,需要删除重复的节点(p->next = q->next),如果没有移动过,移动p指针(p=p->next)进行下一次循环
3、代码
ListNode* deleteDuplicates(ListNode* head) {
if(NULL == head || NULL == head->next)
return head;
ListNode *tmpNode = new ListNode(0);
tmpNode->next = head;
ListNode *p = tmpNode;
while(NULL != p->next)
{
ListNode *q = p->next;
while(NULL != q->next && q->val == q->next->val)
{
q = q->next;
}
if(q == p->next)
{
p = p->next;
}
else
p->next = q->next;
}
return tmpNode->next;
}