描述:
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2 输出: 1->2
示例 2:
输入: 1->1->2->3->3 输出: 1->2->3
解答:
1.直接求解
通过将结点的值与它之后的结点进行比较来确定它是否为重复结点。如果它是重复的,我们更改当前结点的 next
指针,以便它跳过下一个结点并直接指向下一个结点之后的结点。
public ListNode deleteDuplicates(ListNode head) {
ListNode current = head;
while (current != null && current.next != null) {
if (current.next.val == current.val) {
current.next = current.next.next;
} else {
current = current.next;
}
}
return head;
}
2.从左到右 用两个节点连接起来
public ListNode deleteDuplicates(ListNode head) {
if (head == null) {
return null;
}
ListNode pre = new ListNode(-1);
ListNode mostLeft = pre; // 记录虚拟位置 最左边的
ListNode cur = head;
while (cur != null) {
while (cur.next != null && cur.val == cur.next.val) {
cur = cur.next; // 跳过重复的 来到下一个
}
pre.next = cur; // 连接起来
// cur和pre分别来到它们下一个位置
cur = cur.next;
pre = pre.next;
}
return mostLeft.next; //返回头节点
}