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

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

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

感谢大家的三连支持!

相关推荐
汉克老师2 小时前
CSP-J 2026 初赛试题解析(第一部分:选择题(8-15))精讲
c++·csp-j·小学生·学c++编程
wabs6663 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树
风合星语4 小时前
2026 ROS 2 Lyrical C++ 入门(五):Action 实战——任务反馈、取消与超时处理
c++·机器人·ros2·异步编程·lyrical
91刘仁德4 小时前
C++ 继承和多态 设计模式
c语言·c++·笔记
雨落在了我的手上5 小时前
Java数据结构(十四):Map和Set
数据结构
码行山野赴时序归途5 小时前
链表家族收官篇:循环链表
c语言·开发语言·数据结构·链表
库玛西5 小时前
哈夫曼树与前缀编码:数据压缩的贪心核心
c语言·c++·笔记·考研
别动我齐刘海5 小时前
ROS2 Jazzy + C++ 实战路线——进阶学习3
c++·人工智能·vscode·python·算法·机器学习·机器人
0+1115 小时前
算法 --滑动窗口
c++·算法·leetcode
stolentime6 小时前
(有原题)CSP-S2026第一轮试题(附答案解析、markdown源码)
c++·csp