(Leetcode 82) Remove Duplicates from Sorted List II (Java)
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
因为水平有限,难免有疏忽或者不准确的地方,希望大家能够直接指出来,我会及时改正。一切为了知识的分享。
后续会有更多的精彩的内容分享给大家。
支付宝扫一扫
微信扫一扫
