给定一个排序链表,删除所有重复的元素只留下原链表中没有重复的元素。
样例
给出 1->2->3->3->4->4->5->null
,返回 1->2->5->null
给出 1->1->1->2->3->null
,返回 2->3->null
解题思路:
照例新建一个dummy节点作为首部,然后用两个指针left与right分别指向重复元素的前一个元素和重复元素的后一个元素,使得(left , right)之间为重复元素。如果中间没有重复元素则向后考察元素,如果有则将left.next = right即可删除中间重复元素。
始终注意right不要越界问题!
/**
* Definition for ListNode
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
/**
* @param head: head is the head of the linked list
* @return: head of the linked list
*/
public ListNode deleteDuplicates(ListNode head) {
// write your code here
ListNode dummy = new ListNode(0);
dummy.next = head;
//使得(left,right)之间的元素是重复的数字,前开后开
ListNode left = dummy;//指向重复元素的前一个元素
ListNode right = head;
while(right != null){
right = right.next;
//如果重复,将right指针指向重复元素的后一个元素
while(right != null && left.next.val == right.val)
right = right.next;
if(left.next.next == right) //如果两指针间不存在重复元素,则继续移动两指针
left = left.next;
else //如果两指针间存在重复元素,则将left与right连接,删除重复元素
left.next = right;
}
return dummy.next;
}
}