首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从链表中删除重复项

是指在一个链表中删除重复出现的节点,使得每个节点的值在链表中只出现一次。

链表是一种常见的数据结构,由一系列节点组成,每个节点包含一个值和一个指向下一个节点的指针。删除重复项的操作可以通过遍历链表并使用哈希表来实现。

具体步骤如下:

  1. 创建一个哈希表,用于存储已经出现过的节点的值。
  2. 初始化两个指针,一个指向当前节点,一个指向前一个节点(初始时为NULL)。
  3. 遍历链表,对于每个节点:
    • 检查当前节点的值是否已经在哈希表中存在。
    • 如果存在,说明该节点是重复的,将前一个节点的指针指向当前节点的下一个节点,跳过当前节点。
    • 如果不存在,将当前节点的值添加到哈希表中。
    • 更新前一个节点的指针为当前节点。
    • 更新当前节点为下一个节点。
  • 返回链表的头节点。

这样,经过遍历和删除操作后,链表中的重复项将被删除,每个节点的值在链表中只出现一次。

以下是一个示例的C++代码实现:

代码语言:txt
复制
#include <unordered_set>

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(NULL) {}
};

ListNode* deleteDuplicates(ListNode* head) {
    if (head == NULL) {
        return NULL;
    }
    
    std::unordered_set<int> seen;
    ListNode* prev = NULL;
    ListNode* curr = head;
    
    while (curr != NULL) {
        if (seen.count(curr->val)) {
            prev->next = curr->next;
            delete curr;
        } else {
            seen.insert(curr->val);
            prev = curr;
        }
        curr = prev->next;
    }
    
    return head;
}

这段代码使用了C++的unordered_set来实现哈希表,通过遍历链表并使用哈希表来删除重复项。在每个节点的值已经存在于哈希表中时,将前一个节点的指针指向当前节点的下一个节点,从而删除当前节点。

推荐的腾讯云相关产品:无

希望以上回答能够满足您的需求。如果还有其他问题,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Swift 排序数组删除重复 - LeetCode

排序数组删除重复 给定一个有序数组,你需要原地删除其中的重复内容,使每个元素只出现一次,并返回新的长度。 不要另外定义一个数组,您必须通过用 O(1) 额外内存原地修改输入的数组来做到这一点。...], 你的函数应该返回新长度 2, 并且原数组nums的前两个元素必须是1和2 不需要理会新的数组长度后面的元素 要求在原地修改,同时是有序数组 定义一个长度标识 var size = 0 记录不重复元素的位置...遍历数组,当数组元素 nums[i] 和 nums[size] 相等时,说明该数字重复,不予处理,不相等是,使size + 1。...(Swift已经废弃了++运算符,所以在使用 size += 1 代替。...开始用Swift学习算法,在LeetCode开始做初级算法这一章节,将做的题目在此做个笔记吧。

5.1K10

删除链表重复节点.

前言 在一个排序的链表,存在重复的节点,如何删除链表重复的节点并返回删除后的链表头指针?例如:1->2->3->3->4->4->5,处理后为: 1->2->5。...常规思路 根据题意,我们可以知道链表的元素是排好序的。如果节点重复的话,当前节点一定与下一个节点相同。...其次,我们需要创建两个指针: 一个指向当前不重复的节点,我们将它命名为pre 一个为搜索指针,用于搜索链表与当前节点不重复的节点,我们将它命名为last 随后,我们为 pre 与 last 进行初始赋值...我们通过文章开头所举的例子,将其代入上述思路,画一个图来帮助大家更好的理解上述思路,如下所示: image-20220226224625702 实现代码 接下来,我们将上述思路转换为代码,如下所示: /** * 删除链表重复节点...我们将文章开头所举的例子,代入上述思路,画一下它的递归栈帮助大家更好的理解,如下所示: image-20220228231355965 实现代码 接下来,我们将上述思路转换为代码,如下所示: /** * 删除链表重复节点

2.8K40

算法练习(2)-删除有序数组单链表重复

要求:   删除有序数组(或有序单链表)重复。...示例:   输入[1,1,2,2,3] 输出[1,2,3]   输入a->b->b->c->c 输入a->b->c 思路: 双指针,慢指针第1个有效元素开始,快指针第2个有效元素开始,快指针对应的元素与慢指针对应的元素比较...,如果发现相同,说明有重复,快指针向前移,如果不同,说明该元素不重复,将其复制到慢指针的后一位,同时快、慢指针均向前移,不断重复,直到结束。.../** * 有序数组删除重复 * @param nums * @return 去重后的元素个数 */ public int removeDuplicates...仍然可以用双指针法,但是每次fast指针对应的元素,就必须再到慢指针之前的所有元素,对比一次,才能知道是不是重复了。

57140

算法篇:链表删除链表重复节点

算法: 核心点在于如何找到重复节点,有序链表的话,只要下一个节点与当前节点数值一样就是重复节点,直接将当前节点指向下一个节点的下一个节点即可。 本算法需要注意哨兵节点的小技巧。...题目1:删除排序链表重复元素 https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/submissions/ ?...题目2: 删除排序链表重复元素 ?...代码实现 // 算法:与题目1的不同之处在于,本题目是删除所有重复的节点, // 也就是说不单单要找到重复节点的位置, // 还需要将第一个重复节点的前一个节点记录下来,这里叫做pre // 然后通过pre.Next...去指向重复节点的后面哪一个不重复的节点,来完成删除

68510

删除排序数组重复

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。...你不需要考虑数组超出新长度后面的元素。...你不需要考虑数组超出新长度后面的元素。...---- 问题信息 输入:已排好序的数组 输出:去重后新数组的长度 额外条件:不创建额外空间直接修改原数组去重,不考虑新数组长度之后的元素 思考 很显然需要遍历扫描重复,在元素不同的时候设置值。.../* 给定 nums = [0,0,1,1,1,2,2,3,3,4], 第一位是直接不变,第二位才开始需要判断 */ nums[1] == nums[0] 相等 nums[2] == nums[0]

5K20
领券