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. 单独划分一个溢出区存储冲突元素,主哈希表与溢出区分离管理。

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

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

感谢大家的三连支持!

相关推荐
远离UE43 分钟前
UE5 compute shader 原子加
开发语言·c++·ue5
C+-C资深大佬5 分钟前
C++ 显式类型转换详解:static_cast、dynamic_cast、const_cast、reinterpret_cast
开发语言·c++
码少女1 小时前
数据结构——哈希表的基础
数据结构·散列表
luj_17682 小时前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
取地址符2 小时前
C++学习笔记(基于learn-cxx)(1)
c++·经验分享·笔记·学习
思麟呀2 小时前
C++17(三)if constexpr+折叠表达式
开发语言·c++
ysa0510302 小时前
【板子】ST表
c++·笔记·算法·板子
CHHH_HHH3 小时前
【C++11】深入解析C++可变参数模板
开发语言·c++·算法·stl·c++11
十五年专注C++开发3 小时前
fatal error C1189: #error: WinSock.h has already been included 的解决方案
c++·socket·boost
旖-旎6 小时前
《LeetCode 53 最大子数组和 || LeetCode 918 环形子数组的最大和》
c++·算法·leetcode·动态规划