1.7 - 删除排序链表中的重要元素II && 哈希冲突常用解决冲突方法

目录

1.删除排序链表中的重要元素II

a.核心思想

b.思路

c.步骤

2.哈希冲突常用解决冲突方法


1.删除排序链表中的重要元素II

82. 删除排序链表中的重复元素 II - 力扣(LeetCode)https://leetcode.cn/problems/remove-duplicates-from-sorted-list-ii/

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode* dummy = new ListNode(0);
        dummy->next = head;
        ListNode* prev = dummy;
        ListNode* curr = head;
        
        while (curr != nullptr && curr->next != nullptr) 
        {
            if (curr->val == curr->next->val) 
            {
                int duplicateVal = curr->val;
                while (curr != nullptr && curr->val == duplicateVal) 
                {
                    ListNode* temp = curr;
                    curr = curr->next;
                    delete temp; // 释放内存,避免内存泄漏
                }
                prev->next = curr;
            } 
            else 
            {
                prev = curr;
                curr = curr->next;
            }
        }

        return dummy->next;
    }
};

a.核心思想

利用已排序链表的有序性,通过一次遍历,跳过重复的节点,从而删除重复元素。

b.思路

使用两个指针,一个指针用于遍历链表,另一个指针用于指向当前不重复的链表的最后一个节点。在遍历过程中,如果当前节点值与下一个节点值相同,则跳过所有值相同的节点;否则,将不重复节点连接到结果链表中。

c.步骤

① 创建一个虚拟头节点,方便处理头节点可能被删除的情况。

② 初始化两个指针,prev指向虚拟头节点,curr指向原始链表的头节点。

③ 遍历链表,当curr和curr->next不为空时:

  • 如果curr和curr->next的值相同,记录该值,然后将curr不断后移,直到遇到值不同的节点。

  • 将prev->next指向值不同的节点,更新curr。

  • 如果curr和curr->next的值不同,则将prev后移,curr后移。

④ 返回虚拟头节点的下一个节点作为新链表的头节点。

2.哈希冲突常用解决冲突方法

  1. 开放定址法

    1. 线性探测:冲突时顺序查找下一个空槽(如 hash(key) + i,i=1,2,3...)。

    2. 二次探测:使用平方步长(如 hash(key) ± i²)分散冲突。

    3. 双重哈希:冲突时用另一个哈希函数计算步长(如 hash1(key) + i·hash2(key))。

  2. 链地址法

    1. 将哈希值相同的元素通过链表存储,每个槽位维护一个链表头指针。
  3. 再哈希法

    1. 冲突时使用其他哈希函数重新计算地址(如 hash2(key)),直到无冲突。
  4. 公共溢出区

    1. 单独划分一个溢出区存储冲突元素,主哈希表与溢出区分离管理。

核心逻辑:通过空间扩展、二次计算或链式存储,将冲突元素分散到不同位置,保障哈希表高效存取。

希望这些内容对大家有所帮助!

感谢大家的三连支持!

相关推荐
h39741 小时前
DirectShow过滤器开发-视频源过滤器
c++·windows·音视频·directshow
程序猿编码3 小时前
榨干 RTX5090 算力!Qwen3 专用单卡推理引擎,手写C++/CUDA 算子实现 MTP 推测解码
开发语言·c++·大模型推理·qwen3·多模态推理
西飘客4 小时前
vs 怎么根据dll 生成lib文件
c++·qt
程序员老陆5 小时前
深入理解 C++ thread_local:线程私有存储的正确打开方式
开发语言·c++·程序设计
夏幻灵5 小时前
LeetCode 21:合并两个有序链表——双指针与哑节点详解
算法·leetcode·链表
码完就睡7 小时前
数据结构——红黑树
数据结构
码爸7 小时前
数据结构详细介绍
数据结构
半杯咖啡半行码8 小时前
C++ 编程与 STL 模板:从泛型编程到内存安全详解
开发语言·c++
xh didida9 小时前
Linux -- 基础IO
linux·服务器·开发语言·c++
垆边人似月.9 小时前
华为机试题 :两数之和
c++·算法·华为