剑指_18.删除链表中的重复数字

来源:互联网 发布:淘宝长图 编辑:程序博客网 时间:2024/06/18 08:39

1.删除链表中的重复数字关键是如何解决头结点就是重复数字的情况。

public ListNode deleteDuplication(ListNode pHead)    {if(pHead==null) return null;        ListNode pre=new ListNode(0);        ListNode dummy=pre;        ListNode p=pHead;        pre.next=p;                while(p!=null&&p.next!=null&&pre.next!=null){            if(p.val==p.next.val){                if(p.next.next!=null){                    //pre.next=p;                    p=p.next.next;                    pre.next=p;                }else{                    pre.next=null;                }            }else{                pre=pre.next;                p=p.next;            }                    }        return dummy.next;    }

上面这种情况能解决重复数字不在头节点的时候,但不能解决重复数字在头节点的情况。


public ListNode deleteDuplication(ListNode pHead)    {if(pHead==null) return null;ListNode pre=null;ListNode p=pHead;while(p!=null) {if(p.next!=null&&p.val==p.next.val) {int val=p.val;while(p.next!=null&&p.next.val==val) {p=p.next;                    //因为重复的数值不止一次,先不断的移动节点p.}                p=p.next;//最后退出循环,是因为p.next.val不是相同数值,则将p移动到p.nextif(pre==null) {pHead=p;                    //如果此时pre=null,则表明,没有进行else语句,表明头结点就是重复节点                    //这是关键一步,如果重复的节点就是头节点,则要将pHead重新置为p.next}else {pre.next=p;}}else {pre=p;//将pre节点向后移动,始终保证pre节点在p节点的前面                //与pre.next=p的区别是,pre节点没有移动,只是将pre和p节点连接起来                //与pre=pre.next的区别是,必须先保证pre.next指向p                p=p.next;}}return pHead;//最后返回的是pHead    }

这种方法没有采用返回dummy.next这种下一个节点的方式,主要原因就是因为下一个头结点会改变。


原创粉丝点击