由题可知链表是排好序的,且重复的节点不做保留。
我们肯定是需要遍历链表的,所以cur必不可少(cur=head),在原有链表进行操作的话有点复杂,所以接下来我们可以new一个新节点newHead用来接收数据。然后我们遍历链表,如果cur.val==cur.next.val(重复节点),则继续向下遍历(cur=cur.next),(但可能重复节点有好多个,则需要一个循环),且当结束循环时还需要向下走一步(cur=cur.next)
if(cur.next!=null&&cur.val==cur.next.val)
{
while(cur.next!=null&&cur.val==cur.next.val)
{
cur=cur.next;
}
cur=cur.next;
}
如果cur.val!=cur.next.val,则将cur这个节点连接到tmp(tmp=newHead)后面(tmp.next=cur),tmp后移(tmp=tmp.next)cur后移(cur=cur.next)。
我们之前老强调链表要注意头和尾,这里就有坑了。如果最后一个节点也是重复节点的话就会被删掉,但此时tmp.next不为空,所以此时要将其置为空。
else{
tmp.next=cur;
tmp=tmp.next;
cur=cur.next;
}
tmp.next=null;
下面结合图片来理解
开始
中间
中间
尾部
具体代码:
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
if(pHead==null)
{
return null;
}
ListNode newHead=new ListNode(-1);
ListNode tmp=newHead;
ListNode cur=pHead;
while(cur!=null)
{
if(cur.next!=null&&cur.val==cur.next.val)
{
while(cur.next!=null&&cur.val==cur.next.val)
{
cur=cur.next;
}
cur=cur.next;
}
else{
tmp.next=cur;
tmp=tmp.next;
cur=cur.next;
}
tmp.next=null;
}
return newHead.next;
}
}