java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE, JavaME, JavaSE)的总称。本站提供基于Java框架struts,spring,hibernate等的桌面应用、web交互及移动终端的开发技巧与资料

保持永久学习的心态,将成就一个优秀的你,来 继续搞起java知识。

题目:Remove Duplicates from Sorted List II
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

.
解题思路:
这道题和下一道题83题很相近,所不同的是,这道题只要有重复的就将其全部删除。因此,首先是删除重复的结点,只留下那个比较的结点,最后再将这个结点也删除了就可以了。这道题首先设置了一个空的头结点dummy,方便操作,不用单独对头进行处理。
具体思路看下面的代码,应该看了代码就很容易理解了。

public class Solution {
    public static ListNode deleteDuplicates(ListNode head) {
        if( head == null || head.next == null ){
			return head;
		}
		//设置了一个空的头结点dummy,方便操作,不用单独对头进行处理
		ListNode dummy  = new ListNode(-1);
		dummy.next = head;
		//pre结点始终保持在p之前,为的是有重复的话可以删除p结点
        ListNode pre = dummy, p = head, q = p.next;
        boolean flag = false;   //设置一个flag,标记如果有重复的且执行了删除动作之后设置flag为true
        while( q != null ){
        	if( p.val == q.val ){
        		q = q.next;
        		p.next = q;
        		flag = true;
        	}
        	else{    //等删除完重复的结点之后判断是否执行了删除动作
        	    if( flag == true ){    //如果执行了删除动作则将此时正在指向重复结点的p删除
        	        pre.next = q;
        	        flag = false;   //再将flag设置回去为false
        	    }
				else{
				    pre = p;
				}
				p = q;
            	q = q.next;
        	}
        	//这个判断是处理如果最后一个结点也是重复的话删除最后一个结点
        	if( q == null && flag == true ){  
        		pre.next = q;
				//此时也应该像上面一样将flag设置回去为false,不过因为链表结束了
				//不用再设置了
        	}
        }
        //System.out.println(pre.val);
        return dummy.next;
    }
}

以上就是这道题的解法,耗时1ms。如果觉得不错,可以顶一下,支持一下,谢谢!
leetcodejavalinkedlist

因为水平有限,难免有疏忽或者不准确的地方,希望大家能够直接指出来,我会及时改正。一切为了知识的分享。

后续会有更多的精彩的内容分享给大家。