「这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战」
前言
力扣第八十三题 删除排序链表中的重复元素 如下所示:
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
示例 1:
输入: head = [1,1,2]
输出: [1,2]
示例 2:
输入: head = [1,1,2,3,3]
输出: [1,2,3]
一、思路
这一题和力扣第八十二题非常的像,那个是需要删除链表中所有的重复元素(不保留重复的元素),这个是只需要删除重复的元素,使每个元素只出现一次,有兴趣的也可以看一下上一题。
因为我们可以通过当前元素 current 和下一个元素 next 就能比较出下一个元素 next 是否重复,所以是不需要 前置元素 的。
实现的大致步骤如下所示:
current: 指向当前的元素
next:指向当前元素的下一个元素
current指向第一个元素,next指向第二个元素- 开始遍历链表,当
next为空时结束遍历 - 如果再遍历的过程中出现了
next的值与current的值相同,说明出现了重复值,则让next一直向下,直到找到与current不相同的元素。让后将current的下一个节点指向next,再将current移动到新的头节点,即current指向next,再将next指向next的下一个元素 - 如果
current和next的值不相同,则都指向自身的下一个元素即可 - 返回原来的头节点
head作为结果即可
举个例子
此处以示例中的 head = [1,1,2,3,3] 作为例子
- 初始化:
current指向第一个节点,next指向第二个节点 - 开始遍历,此时出现了
current.val == next.val,故向下移动next,直到next指向2。然后再将current.next = next; current = next; next = next.next - 继续遍历,
current和next指向的2和3不相等,故都向下移动。current = current.next; next = next.next - 继续遍历,
current和next指向的3和3相等,故向下移动next,直到next移出了链表,即next = null。此时更新current即可,current.next = next; current = next - 返回原先的
head节点,链表已变成了1 -> 2 -> 3
二、实现
实现代码
实现代码与思路中保持一致
public ListNode deleteDuplicates(ListNode head) {
// 特殊情况(只有一个元素或没有元素)
if (head == null || head.next == null)
return head;
ListNode current = head;
ListNode next = head.next;
while (next != null) {
// 如果有元素重复
if (next.val == current.val) {
while (next != null && next.val == current.val) {
next = next.next;
}
current.next = next;
current = next;
if (next == null) { // 如果没有元素了,结束循环
break;
}
next = next.next;
} else {
current = current.next;
next = next.next;
}
}
return head;
}
测试代码
public static void main(String[] args) {
ListNode listNode1 = new ListNode(1, new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(3)))));
ListNode listNode2 = new ListNode(1, new ListNode(2, new ListNode(3, new ListNode(3, new ListNode(4, new ListNode(4, new ListNode(5)))))));
ListNode listNode3 = new ListNode(1, new ListNode(1));
new Number83().deleteDuplicates(listNode1);
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~