链表——删除排序链表的重复结点(一个都不保留)

来源:互联网 发布:java编程怎样弄下划线 编辑:程序博客网 时间:2024/05/22 02:46

题目:删除排序链表中的所有重复结点,只留下没有重复过的那些结点。


For example,
Given1->2->3->3->4->4->5, return1->2->5.
Given1->1->1->2->3, return2->3.


思路:

设置三个指针 ppre,pcur,pnext,pcur始终指向链表中一个数字第一次出现时候的位置;每次循环开始时,pnext设为pcur的下一个结点,判断pnext.val是否等于pcur.val。

1.若不相等,当前pcur指向的数字没有重复过,ppre不再为空。

2.若相等,则为重复结点,循环 pcur == pcur.next 直到 pcur == null或者条件不再成立,为的就是让pcur指向下一个数字第一次出现的位置!

此时若ppre == null,表明头结点也在重复结点中,则头结点需要变更,head = pcur;否则 ppre.next = pcur;


代码如下:

/** * Definition for singly-linked list. * public class ListNode { *     int val; *     ListNode next; *     ListNode(int x) { *         val = x; *         next = null; *     } * } */public class Solution {    public ListNode deleteDuplicates(ListNode head) {        if(head==null||head.next==null)            return head;                ListNode ppre=null;        ListNode pcur=head;//pcur始终指向排序链表每个数字第一次出现时候的位置。        ListNode pnext=null;                while(pcur!=null)            {            pnext=pcur.next;            if(pnext!=null&&(pcur.val==pnext.val))                {                int temp=pcur.val;                while(pcur!=null&&pcur.val==temp)                    {                    pcur=pcur.next;                }                     if(ppre==null)                        {                        head=pcur;                    }                    else                        {                        ppre.next=pcur;                    }               } else//若pcur和pnext不是重复数字,更新ppre               {                   ppre=pcur;                   pcur=pnext;               }         }               return head;    }}


0 0
原创粉丝点击