题目描述:给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
思路一:使用哑结点和快慢指针,快指针用于跳过重复的数组,慢指针用于和快指针拼接。
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null)
return head;
ListNode dummy = new ListNode(-1000);
dummy.next = head;
ListNode slow = dummy;
ListNode fast = dummy.next;
while (fast != null) {
while (fast.next != null && fast.val == fast.next.val)
fast = fast.next;
// 如果快、慢指针之间没有重复数组,则统一往后移动
if (slow.next == fast)
slow = slow.next;
// 如果之间存在重复数组,那么慢指针和快指针(当前指向的是重复数字)进行拼接
else
slow.next = fast.next;
fast = fast.next;
}
return dummy.next;
}
}
思路二:使用一个新的节点,用于拼接没有重复数字的节点,遍历链表count用来记录,如果超过1,那么就跳过,如果等于1,该节点拼接。
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode p1 = head;
ListNode p2 = new ListNode(0);
ListNode Head = p2;
ListNode temp = null;
int count,value;
while(p1 != null) {
temp = p1;
count = 0;
value = p1.val;
while(p1 != null && p1.val == value) {
++count;
p1 = p1.next;
}
if(count == 1) {
p2.next = temp;
p2 = temp;
}
}
p2.next = null;
return Head.next;
}
}