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指向原始链表的头节点。

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

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

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

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

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

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

  1. 开放定址法

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

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

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

  2. 链地址法

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

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

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

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

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

感谢大家的三连支持!

相关推荐
linweidong1 小时前
C++ 模块化编程(Modules)在大规模系统中的实践难点?
linux·前端·c++
郝学胜-神的一滴6 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
半桔6 小时前
【IO多路转接】高并发服务器实战:Reactor 框架与 Epoll 机制的封装与设计逻辑
linux·运维·服务器·c++·io
HABuo6 小时前
【linux文件系统】磁盘结构&文件系统详谈
linux·运维·服务器·c语言·c++·ubuntu·centos
我在人间贩卖青春7 小时前
C++之多重继承
c++·多重继承
m0_736919107 小时前
C++代码风格检查工具
开发语言·c++·算法
2301_763472469 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
阿猿收手吧!9 小时前
【C++】std::promise原理与实战解析
c++
m0_7066532310 小时前
分布式系统安全通信
开发语言·c++·算法
Zach_yuan10 小时前
深入浅出 JSONCpp
linux·服务器·网络·c++