在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
解析:从头遍历整个链表,如果当前节点的值与下一个节点的值相同,那么他们就是重复的节点,都可以被删除。为了保证删除之后的链表还是相连的,我们要把当前节点的前一个节点的和后面没有重复的节点相连.
public ListNode deleteDuplication(ListNode pHead)
{
if(pHead==null){
return pHead;
}
//上一个节点
ListNode preNode=null;
//当前节点
ListNode curNode=pHead;
while(curNode!=null){
//记录是否要删除
boolean needToDelete=false;
if(curNode.next!=null&&curNode.val==curNode.next.val){
needToDelete=true;
}
//重复需要删除
if(needToDelete){
ListNode toBeDelNode=curNode;
int value=toBeDelNode.val;
//找出重复节点值
while(toBeDelNode!=null&&toBeDelNode.val==value){
toBeDelNode=toBeDelNode.next;
}
//删除的节点是头结点
if(preNode==null){
pHead=toBeDelNode;
}else{
//纸向删除节点下一个值
preNode.next=toBeDelNode;
}
curNode=toBeDelNode;//不能next,重复的值可能再次出现
//不重复
}else{
preNode=curNode;
curNode=curNode.next;
}
}
return pHead;
}