83. 删除排序链表中的重复元素II
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
例子
例子1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
例子2:
输入: 1->1->1->2->3
输出: 2->3
代码
public static ListNode deleteDuplicates(ListNode head) {
ListNode l1 = head;
ListNode temp1 ;
if(head == null ){//这边应该可以优化成一个&
return head;
}
if(head.next == null){
return head;
}
while(head.next != null){
if(head.val == head.next.val){
head.next = head.next.next;
temp1 = l1;
if(head.next == null){
if(l1.next == null){
return null;
}
while(l1.next.next != null){
l1 = l1.next;
}
l1.next = null;
// head = null;//这里不知道为何置空还会输出
return temp1;
}
while( head.val == head.next.val){
head.next = head.next.next;
if(head.next == null){
break;
}
}
if(head.next != null){
head.val = head.next.val;
head.next = head.next.next;
}else{
temp1 = l1;
if(head.next == null){
if(l1.next == null){
return null;
}
while(l1.next.next != null){
l1 = l1.next;
}
l1.next = null;
// head = null;//这里不知道为何置空还会输出
return temp1;
}
}
}else {
head = head.next;
}
}
return l1;
}
----别人的代码,用快慢指针。
public ListNode deleteDuplicates(ListNode head) {
if(head==null || head.next==null)return head;
ListNode dummy=new ListNode(0);
dummy.next=head;
ListNode fast=dummy.next,slow=dummy;
while(fast!=null ){
if(fast.next!=null&&fast.val==fast.next.val){
while(fast.next!=null&&fast.val==fast.next.val){
fast=fast.next;
}
slow.next=fast.next;
fast=fast.next;
}else{
fast=fast.next;
slow=slow.next;
}
}
return dummy.next;
}
注意事项
注意链表只存在多个一样的
待优化
可以使用快慢指针。