题目
83. 删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
解题方法
单指针遍历
public ListNode deleteDuplicates(ListNode head) {
ListNode cur = head;
while (cur != null && cur.next != null) {
// 如果当前值和下一个节点的值相等,则跳过下一个节点 否则继续遍历
if (cur.val == cur.next.val) {
cur.next = cur.next.next;
} else {
cur = cur.next;
}
}
return head;
}
递归
public ListNode deleteDuplicates(ListNode head) {
// 如果当前指针为空或者下一个节点为空,则返回当前指针
if (head == null || head.next == null) {
return head;
}
// head指向后面已经去重之后的指针
head.next = deleteDuplicates(head.next);
// 如果当前节点值和下一个节点的值相等,返回下一个节点,否则返回当前节点
return head.val == head.next.val ? head.next : head;
}
82. 删除排序链表中的重复元素 II
82. 删除排序链表中的重复元素 II
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
解题方法
递归
1.特殊情况,头节点为null或头节点下一节点为null,直接返回头节点,这时不存在重复节点
2.如果头节点与,头节点的下一节点值相等,跳过所有相等节点。递归调用函数判断最后一个跳过节点的后一节点。
3.如果头节点与,头节点的下一节点值不等,递归调用函数判断头节点的后一节点。
public ListNode deleteDuplicates(ListNode head) {
// 递归结束条件
if (head == null || head.next == null) {
return head;
}
// 如果相等则跳过所有相等节点
if (head.val == head.next.val) {
while (head != null && head.next != null && head.val == head.next.val) {
head = head.next;
}
return deleteDuplicates(head.next);
// 否则递归调用判断后一个节点
} else {
head.next = deleteDuplicates(head.next);
return head;
}
}
迭代解法
设置一个虚拟节点, 以处理当重复节点出现在head节点的情况,需要额外一个指针pre 指向重复元素的前一个结点, 以便完成删除操作。
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) {
return head;
}
// 不同于83:删除排序链表中的重复元素, 该题是要删除所有重复的元素, 一个都不进行保留
// 设置一个虚拟节点, 以处理当重复节点出现在head节点的情况
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
// pre 节点指向重复元素的前一个节点, 以便完成删除操作
ListNode pre = dummyHead;
ListNode cur = head;
while (cur != null && cur.next != null) {
// 找到相同元素继续向后遍历, 找到不重复的元素
if (cur.val == cur.next.val) {
cur = cur.next;
while (cur.next != null && cur.val == cur.next.val) {
cur = cur.next;
}
// 删除相同元素, pre 指针不需要进行额外改变
pre.next = cur.next;
} else {
// 当前没有找到重复元素, pre 和 curr 同时向后移动
pre = cur;
}
cur = cur.next;
}
return dummyHead.next;
}