题目地址:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/
题目:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
试题分析:
该题核心的思路是扫描到节点后内部嵌套一个循环继续往后遍历,因为链表是有序的,所以遍历到节点值不相等即可停止修改链表连接,一次性将中间重复的元素删除就完成了重复元素的删除,整个的时间复杂度为O(n),虽然在外循环内部嵌套了一个循环,但是因为链表是有序的,内部不会出现再次重复循环。因为可能会对头节点有删除操作,所以新建了空头节点,并记录删除节点前置指针用于删除重复节点使用。
代码:
public ListNode deleteDuplicates(ListNode head) {
ListNode newHead = new ListNode(-1);
newHead.next = head;
ListNode pre = newHead;
if(head==null || head.next==null){
return head;
}
ListNode cur = head;
while(cur!=null){
boolean duplicate = false;
while(cur.next!=null && cur.val==cur.next.val) {
//对重复数字进行循环删除
duplicate = true;
cur = cur.next;
}
//删除最后一个重复节点
if(duplicate){
pre.next = cur.next;
}else {
pre.next = cur;
pre = cur;
}
cur = cur.next;
}
return newHead.next;
}
源码路径:com.monkey01.linkedlist.RemoveDuplicatesFromSortedListII_82
配套测试代码路径:test目录com.monkey01.linkedlist.RemoveDuplicatesFromSortedListII_82Test