力扣之有序链表去重

删除链表中的重复元素,重复元素保留一个

p1 p2

1 -> 1 -> 2 -> 3 -> 3 -> null

p1.val == p2.val 那么删除 p2,注意 p1 此时保持不变
p1 p2

1 -> 2 -> 3 -> 3 -> null

p1.val != p2.val 那么 p1,p2 向后移动
p1 p2

1 -> 2 -> 3 -> 3 -> null

p1 p2

1 -> 2 -> 3 -> 3 -> null

p1.val == p2.val 那么删除 p2
p1 p2

1 -> 2 -> 3 -> null

当 p2 == null 退出循环

代码

java 复制代码
public ListNode deleteDuplicates(ListNode head) {
    // 链表节点 < 2
    if (head == null || head.next == null) {
        return head;
    }
    // 链表节点 >= 2
    ListNode p1 = head;
    ListNode p2;
    while ((p2 = p1.next) != null) {
        if (p1.val == p2.val) {
            p1.next = p2.next;
        } else {
            p1 = p1.next;
        }
    }
    return head;
}

重复元素一个也不保留

p1 是待删除的上一个节点,每次循环对比 p2、p3 的值

  • 如果 p2 与 p3 的值重复,那么 p3 继续后移,直到找到与 p2 不重复的节点,p1 指向 p3 完成删除

  • 如果 p2 与 p3 的值不重复,p1,p2,p3 向后平移一位,继续上面的操作

  • p2 或 p3 为 null 退出循环

    • p2 为 null 的情况,比如链表为 1 1 1 null

p1 p2 p3

s, 1, 1, 1, 2, 3, null

p1 p2 p3

s, 1, 1, 1, 2, 3, null

p1 p2 p3

s, 1, 1, 1, 2, 3, null

p1 p3

s, 2, 3, null

p1 p2 p3

s, 2, 3, null

p1 p2 p3

s, 2, 3, null

代码

java 复制代码
public ListNode deleteDuplicates(ListNode head) {
    if (head == null || head.next == null) {
        return head;
    }

    ListNode s = new ListNode(-1, head);
    ListNode p1 = s;
    ListNode p2;
    ListNode p3;
    while ((p2 = p1.next) != null && (p3 = p2.next) != null) {
        if (p2.val == p3.val) {
            while ((p3 = p3.next) != null 
                   && p3.val == p2.val) {
            }
            p1.next = p3;
        } else {
            p1 = p1.next;
        }
    }
    return s.next;
}
相关推荐
菜鸟555552 小时前
图论:Floyd算法
算法·图论
呼啦啦啦啦啦啦啦啦7 小时前
常见的排序算法
java·算法·排序算法
胡萝卜3.08 小时前
数据结构初阶:排序算法(一)插入排序、选择排序
数据结构·笔记·学习·算法·排序算法·学习方法
地平线开发者8 小时前
LLM 中 token 简介与 bert 实操解读
算法·自动驾驶
scx201310048 小时前
20250814 最小生成树和重构树总结
c++·算法·最小生成树·重构树
阿巴~阿巴~9 小时前
冒泡排序算法
c语言·开发语言·算法·排序算法
散1129 小时前
01数据结构-交换排序
数据结构·算法
yzx9910139 小时前
Yolov模型的演变
人工智能·算法·yolo
weixin_3077791310 小时前
VS Code配置MinGW64编译SQLite3库
开发语言·数据库·c++·vscode·算法
无聊的小坏坏10 小时前
拓扑排序详解:从力扣 207 题看有向图环检测
算法·leetcode·图论·拓扑学