给定一个排序链表,节点值均为正数,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字
input: 1->1->2->3
output:2->3
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
public class Solution {
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode dummy = new ListNode(-1); // 创建一个哑节点作为新链表的头部
dummy.next = head;
ListNode slow = dummy; // 慢指针
ListNode fast = head; // 快指针
while (fast != null) {
// 当快指针指向的节点值与下一个节点值相等时,继续移动快指针
while (fast.next != null && fast.val == fast.next.val) {
fast = fast.next;
}
if (slow.next == fast) {
slow = slow.next;
} else {
// 如果此时慢指针的下一个节点与快指针的节点值相等,说明该节点需要被删除
// 删除慢指针与快指针之间的所有节点,并将慢指针的next指向快指针
slow.next = fast.next;
}
// 移动快指针
fast = fast.next;
}
return dummy.next; // 返回哑节点的下一个节点,即新链表的头部
}
}