目录
1.删除排序链表中的重要元素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.哈希冲突常用解决冲突方法
开放定址法
线性探测:冲突时顺序查找下一个空槽(如
hash(key) + i,i=1,2,3...)。二次探测:使用平方步长(如
hash(key) ± i²)分散冲突。双重哈希:冲突时用另一个哈希函数计算步长(如
hash1(key) + i·hash2(key))。链地址法
- 将哈希值相同的元素通过链表存储,每个槽位维护一个链表头指针。
再哈希法
- 冲突时使用其他哈希函数重新计算地址(如
hash2(key)),直到无冲突。公共溢出区
- 单独划分一个溢出区存储冲突元素,主哈希表与溢出区分离管理。
核心逻辑:通过空间扩展、二次计算或链式存储,将冲突元素分散到不同位置,保障哈希表高效存取。
希望这些内容对大家有所帮助!
感谢大家的三连支持!