原题链接: https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/
1. 题目介绍
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
给定一个有序链表,删除所有出现次数 1 次以上的元素。只保留出现次数刚好 1 次的元素。
Example 1:
Input: 1->2->3->3->4->4->5
Output: 1->2->5
Example 2:
Input: 1->1->1->2->3
Output: 2->3
2. 解题思路
使用双指针法,设置两个指针,left 和 right。这两个指针中间还隔着一个节点,每次比较left.next.val 和 right.val 的值是否相等。
实现代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
//如果链表为空或者只有一个节点,则必定不会有重复的节点
if(head == null || head.next == null){
return head;
}
ListNode assist = new ListNode(0);
assist.next = head;
//左指针和右指针中间还隔着一个节点
//每次比较left.next.val 和 right.val
ListNode left = assist;
ListNode right= left.next.next;
while(right != null){
//如果相等,则right节点要一直向右寻找
//直到找到不相等的节点,或者链表结束为止
if(right.val == left.next.val){
while(right != null && right.val == left.next.val){
right = right.next;
}
left.next = right;
right = (right == null ? null : right.next);
}
//如果不相等,left和right各自向前移动1步
else{
left = left.next;
right = right.next;
}
}
return assist.next;
}
}