1.给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
/*
* 解题思路:
* 用两个指针,一个指针current记录当前不重复的位置,index记录重复的位置,index指针不断往下移动,知道遇到不重复的数字,
* 移动current指针到index位置,index指针下移知道遇到不重复的位置
*
*/
public static ListNode deleteDuplicates(ListNode head) {
if(head == null) {
return null;
}
ListNode current = head;
ListNode index = current.next;
while(index != null) {
if(current.val == index.val) {
index = index.next;
}else {
current.next = index;
current = index;
index = index.next;
}
}
current.next = index;
return head;
}
2.给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
/*
* 解题思路: 找到最后一个重复的数字
*/
public static ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null) {
return head;
}
//注意备用头结点,头结点可能被删除
ListNode dumpy = new ListNode(-1);
dumpy.next = head;
ListNode pre = dumpy;
ListNode current = pre.next;
while(current != null) {
if(current.next != null && current.val == current.next.val) {
while(current.next != null && current.val == current.next.val) {
current = current.next;
}
pre.next = current.next;
current = current.next;
}else {
pre = pre.next;
current = current.next;
}
}
return dumpy.next;
}