Remove Duplicates from Sorted List II

本文介绍了一种算法,用于从已排序的链表中移除所有具有重复数值的节点,只保留原始列表中的唯一数值。提供了详细的实现思路及Java代码示例。

题目描述:
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.

这个题做了好久,碰到这种情况很多的,都要考虑清楚。

复杂的就一步一步来,先找到第一个与紧挨着的数是不一样的作为head。

到底是否为空,不为空怎么走,为空又怎么走,前面的数是重复过的还是没有重复过的都要想清楚。
代码如下:

public ListNode deleteDuplicates(ListNode head) {
    //找到真正的head,这个head与head.next不同
    head=findHead(head);
    if(head==null||head.next==null){
        return head;
    }
    ListNode pre=head,cur=head.next;
    boolean duplicate=false;
    while(cur!=null){
        ListNode next=cur.next;
        if(next!=null){
            if(next.val==cur.val){
                duplicate=true;
            }else if(duplicate){
                pre.next=next;
                duplicate=false;
            }else{
                pre=cur;
            }
        }else if(duplicate){
            //后面一直都是重复的数要在pre后赋空值,如1,2,2,3,3,此时结果1->null
            pre.next=null;
        }else{
            pre.next=cur;
        }
        cur=cur.next;
    }
    return head;
   }

public ListNode findHead(ListNode head){
    if(head==null||head.next==null){
        return head;
    }
    ListNode pre=head,cur=head.next;
    if(pre.val!=cur.val)
        return pre;
    while(cur!=null){
        if(pre.val!=cur.val){
            break;
        }
        cur=cur.next;
    }
    return findHead(cur);
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值