题目如下图所示(力扣链表82题)
这里给出两种解法:
1、递归实现
从当前节点开始进行寻找并删除节点
若我与next重复,一直找到下一个不重复的节点,以它的返回结果为准
若我与next不重复,返回我,同时更新next
public ListNode deleteDuplicates(ListNode p){
if(p==null||p.next==null){
return p;
}
if(p.val==p.next.val){
ListNode x=p.next.next;
while(x!=null&&x.val==p.val){
x=x.next;
}
return deleteDuplicates(x);//就是与p取值不同的节点
}else {
p.next=deleteDuplicates(p.next);
return p;
}
}
2、非递归实现
这里给出三个节点,一个代表哨兵节点,另外两个进行查找重复元素起始处进行删除,直到p3指向null结束。
public ListNode deleteDuplicates1(ListNode head){
if(head==null||head.next==null){
return head;
}
ListNode s=new ListNode(-1,head);
ListNode p1=s;
ListNode p2;
ListNode p3;
while((p2=p1.next)!=null&&(p3=p2.next)!=null){
if(p2.val==p3.val){
while((p3=p3.next)!=null&&p3.val== p2.val){
}
//p3找到了不重复的值
p1.next=p3;
}else {
p1=p1.next;
}
}
return s.next;
}
感谢观看!六一儿童节快乐!!!