【算法】删除无序有序单链表值重复出现的节点

前置知识

  • 数据结构-链表: 熟悉删除节点的操作。
  • 数据结构-哈希表(如果不太了解,那么可以跳过哈希表方法的部分,笔者提供了数组当哈希表的例子可自行阅读)

题目1
删除排序单链表值重复出现的节点
删除无序单链表值重复出现的节点

题目1:删除排序单链表重复出现的节点

head = [1,1,2,3,3]
删除值重复的,只保留一份。链表有序!

1.哈希大法

利用哈希表我们可以做到线性查询 O ( n ) O(n) O(n), 搞一个哈希表,随时查询。
具体过程:

  1. 先把头节点存储到哈希表中, 因为最初是空表。
  2. 搞两个节点指针,cur,prev。prev指向cur的前驱节点,cur作为循环变量, 当cur指向值重复节点时就进行删除。
class Solution {
   
   
    public ListNode deleteDuplicates(ListNode head) {
   
   
        if (head == null || head.next == null) {
   
   
            return head;
        }
        HashSet<Integer> set = new HashSet<>();
        set.add(head.val);
        ListNode prev = head, cur = head.next;
        while (cur != null) {
   
   
            if (set.contains(cur.val)) {
   
   
                prev.next = cur.next;// 删除cur指向节点
                cur = prev.next;// cur指向下一个节点。
            } else {
   
   
                // set不包含节点cur.val

                // 写入哈希表
                set.add(cur.val);
                // 调整
                prev = cur;
                cur = cur.next;
            }
        }
        return head;// 返回当前头节点
    }
}
2.不会哈希表看这,数组手撕哈希表

不会哈希表怎么办?我的语言没有内置哈希表啊。
很简单,数组就可以充当哈希表。做到 O ( 1 ) O(1) O(1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值