题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5.
<span style="color:#FF0000;">思路:
定义指针pre、p初始化都指向pHead,然后用p遍历链表,
如果p.val和p.next.val值相同,则p往后移,如果不同,则比较pre和p(注意,此处不是比值,而是比较节点是否就是指向同一个),
如果pre和p相同,则表示p(pre)节点是不重复节点,将其加入新链表newHead中,同时pre和p往后移
如果pre和p不相同,则将pre指向p.next,p也往后移,
需要注意的是对于扫描到最后一个节点的处理,如果p.next==null则表示遍历到最后了,
如果pre和p相等,则该节点是不重复的加入到newHead中,
最后别忘记最后一个节点置为null</span>
<strong> public ListNode deleteDuplication(ListNode pHead)
{
ListNode p = pHead;//链表遍历指针
ListNode newHead=new ListNode(-1);//用于存放不重复节点
ListNode q=newHead;//新链表的构建指针
ListNode pre=p;
while(p!=null){
if(p.next!=null&&p.val==p.next.val){//如果当前节点后下一个节点相同,则p往后移
p=p.next;
}else if(p.next!=null){//如果当前节点的值和后一节点的值不同,则当前节点是有可能不是重复节点,判断pre是否等于p
if(pre==p){//如果pre==p,说明p当前节点不是重复节点,则将该节点加入newHead中
q.next=new ListNode(p.val);
q=q.next;
}
pre=p.next;
p=p.next;
}else{//如果p.next为null
if(p==pre){
q.next=new ListNode(pre.val);
q=q.next;
}
break;
}
}
q=null;
return newHead.next;
}</strong>