题目描述
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。
返回 已排序的链表 。
方法1 双指针方式
描述
指针p去找寻是否为相同的节点
如果不是,则在cur后边进行添加,防止重复出现
如果是,直接跳过,遍历下一个节点
存在问题:不需要创建Set对象来存储重复值,因为链表经过排序,
可以使用 cur.val 和 cur.next.val 相等时说明需要去重
代码
package easy.删除排序链表中的重复元素83 ;
import java.util.HashSet;
import java.util.Set;
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this .val = val;
}
ListNode(int val, ListNode next) {
this .val = val;
this .next = next;
}
}
class Solution {
public ListNode deleteDuplicates (ListNode head) {
Set<Integer> set = new HashSet <>();
ListNode p = head.next;
ListNode cur = head;
set.add(head.val);
while (p != null ) {
if (set.contains(p.val)) {
p = p.next;
} else {
set.add(p.val);
cur.next = new ListNode (p.val);
cur = cur.next;
p = p.next;
}
cur.next = null ;
}
return head;
}
}
方法2
描述
指定 cur 指针指向头部 head
当 cur.next 的存在为循环结束条件,当二者有一个不存在时说明链表没有去重复的必要了
当 cur.val 和 cur.next.val 相等时说明需要去重,则将 cur 的下一个指针指向下一个的下一个,这样就能达到去重复的效果
如果不相等则 cur 移动到下一个位置继续循环
代码
package easy.删除排序链表中的重复元素83 ;
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this .val = val;
}
ListNode(int val, ListNode next) {
this .val = val;
this .next = next;
}
}
class Solution2 {
public ListNode deleteDuplicates (ListNode head) {
if (head == null ) return null ;
ListNode cur = head;
while (cur.next != null ) {
if (cur.val == cur.next.val) {
cur.next = cur.next.next;
} else {
cur = cur.next;
}
}
return head;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程