力扣之有序链表去重

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

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;
}
相关推荐
natide10 分钟前
词汇/表达差异-6-n-gram分布距离
人工智能·python·算法
xu_yule16 分钟前
算法基础-多源最短路
c++·算法·多源最短路
火羽白麟34 分钟前
大坝安全的“大脑”——模型与算法
算法·模型·大坝安全
x70x8037 分钟前
C++中auto的使用
开发语言·数据结构·c++·算法·深度优先
xu_yule42 分钟前
算法基础-单源最短路
c++·算法·单源最短路·bellman-ford算法·spfa算法
Evand J1 小时前
【MATLAB免费例程】多无人机,集群多角度打击目标,时间与角度约束下的协同攻击算法,附下载链接
算法·matlab·无人机
YGGP1 小时前
【Golang】LeetCode 118. 杨辉三角
算法·leetcode
蒲小英1 小时前
算法-二分查找
算法
-Thinker1 小时前
贪心算法解决找零钱问题
算法·贪心算法
sin_hielo1 小时前
leetcode 2054(排序 + 单调栈,通用做法是 DP)
数据结构·算法·leetcode