力扣82删除排序链表中的重复元素 II力扣82c语言解题思路
时间: 2024-10-21 12:11:11 浏览: 34
在LeetCode的第82题“删除排序链表中的重复元素 II”中,你的目标是给定一个已排序的链表,删除所有具有两个连续节点值相同的元素,只保留每个这样的值出现的第一个实例。这个问题需要对链表进行遍历,并维护一个辅助数据结构来跟踪已经遇到过的唯一值。
C语言解题思路可以分为以下几个步骤:
1. 定义一个指针`prev`指向当前节点的前一个节点,初始时设为`NULL`,因为头节点前没有节点。
2. 创建一个哈希集合(例如使用`unordered_set`或手动实现一个数组)用于存储已见的值。
3. 遍历链表。对于每个节点`curr`:
- 如果`curr`的值不在哈希集合中,将其添加到集合中,并将`prev`更新为`curr`。
- 否则,说明这是一个重复值,如果`prev`不为空,则断开`prev`和`curr`之间的链接,让`prev`继续前进。
4. 链表遍历结束后,`prev`所指的节点就是新链表的头结点。
```c
struct ListNode* deleteDuplicates(struct ListNode* head) {
if (head == NULL || head->next == NULL) return head;
struct ListNode *prev = NULL, *curr = head;
unordered_set<int> seen;
while (curr != NULL) {
if (seen.find(curr->val) == seen.end()) {
seen.insert(curr->val);
prev = curr;
} else {
prev->next = curr->next;
}
curr = prev->next;
}
return head;
}
```
阅读全文