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

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

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

感谢大家的三连支持!

相关推荐
王老师青少年编程6 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【哈夫曼贪心】:合并果子
c++·算法·贪心·csp·信奥赛·哈夫曼贪心·合并果子
叼烟扛炮6 小时前
C++第二讲:类和对象(上)
数据结构·c++·算法·类和对象·struct·实例化
样例过了就是过了8 小时前
LeetCode热题100 最长公共子序列
c++·算法·leetcode·动态规划
谭欣辰8 小时前
C++ 排列组合完整指南
开发语言·c++·算法
橙子也要努力变强9 小时前
信号捕捉底层机制-机理篇2
linux·服务器·c++
盐焗鹌鹑蛋9 小时前
【C++】stack和queue类
c++
MegaDataFlowers10 小时前
206.反转链表
数据结构·链表
郝学胜-神的一滴10 小时前
罗德里格斯旋转公式(Rodrigues‘ Rotation Formula)完整推导
c++·unity·godot·图形渲染·three.js·unreal
lzh2004091910 小时前
深入理解进程:从PCB内核结构到写时拷贝的底层实战
linux·c++
aseity10 小时前
跨平台项目中QString 与 非Qt 跨平台动态库在字符集上的一个实用的互操作约定.
c++·经验分享