移除重复节点

此博客链接:https://www.cnblogs.com/ping2yingshi/p/12684896.html

移除重复节点(148min)

题目链接:https://leetcode-cn.com/problems/remove-duplicate-node-lcci/

示例1:

输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]
示例2:

输入:[1, 1, 1, 1, 2]
输出:[1, 2]
提示:

链表长度在[0, 20000]范围内。
链表元素在[0, 20000]范围内。

题解:

方法:

1使用集合来存储列表中数,目的是可以筛选出列表中已经存在的数字,进行指针操作。

2.使用两个指针,一个指针是来删选列表中重复的数,另一个指针是选记录不是重复的指针。

思路一:

当列表中的数已在集合中,说明列表中当前这个数时重复的,此时fast指针指向断列表中下一个数继续判断。要是这个数不在集合中,说明这个数不是重复的数,加入集合中,并且把记录列表的指针low的next指向此时的fast指针,low向后移一位,fast也向后移一位.

代码如下:

class Solution {
    public ListNode removeDuplicateNodes(ListNode head) {
        if(head==null||head.next==null)
           return head;
        HashSet <Integer> set=new HashSet<Integer>();//定义一个集合,存放列表中的元素
        ListNode fast=head.next;
        ListNode low=head;
        set.add(head.val);
        while(fast.next!=null)
        {
            if(set.contains(fast.val))
            {

                fast=fast.next;
            }
            else
            {
                set.add(fast.val);
                low.next=fast;
                low=low.next;
                fast=fast.next;
            }
        }

        return low;
    }
}

但是这里结果不对,也没有想明白为啥,个人感觉自己代码写的挺对的。

思路二:

是看别人写的,但是我自己按照数走一遍感觉不对。但是代码确是对的。我简直了。。。。。

说明:pre是头节点,cur是头节点的下一个节点。

思想:把头节点加入到集合中,当cur的值不在集合中时,就使pre指向下一个节点,cur指向pre的下一个节点,当cur当前的数已在集合中,那么使pre的next指向next的next,在把cur指向pre的next.我感觉不对的原因如下图中,当pre=3,cur=3时,此时cur的值是包含在集合中的,那么pre需要指向4,但是这时cur就指向null,最后一个节点就判断不了了。我,太难了。

代码如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode removeDuplicateNodes(ListNode head) {
        HashSet<Integer> set = new HashSet<Integer>();
        if(head == null){
            return null;
        }
        if(head.next == null){
            return head;
        }
        set.add(head.val);
        ListNode pre = head;
        ListNode cur = head.next;
        while(cur!=null){
            int tmp = cur.val;
            if(set.contains(tmp)){
                pre.next=pre.next.next;
            }else{
                set.add(cur.val);
                pre=pre.next;
            }
            cur=pre.next;
        }
        return head;
    }
}

  写此代码的链接:https://leetcode-cn.com/problems/remove-duplicate-node-lcci/solution/javati-jie-setyong-fa-by-baolibin/

原文地址:https://www.cnblogs.com/ping2yingshi/p/12684896.html

时间: 2024-11-05 06:42:17

移除重复节点的相关文章

js中移除空白节点

//移除空白节点,空白节点的类型是3 function removeWhiteNode(node) {     for (var i = 0; i < node.childNodes.length; i++) {         if (node.childNodes[i].nodeType === 3 && /^\s+$/.test(node.childNodes[i].nodeValue)) {             node.childNodes[i].parentNode.

从一个未排序的链表中移除重复项

问题 从一个未排序的链表中移除重复的项? 附, 如果不允许使用临时的缓存,你如何解决这个问题? 分析 如果可以使用额外的存储空间,我们就开一个数组来保存一个元素的出现情况. 对于这种情况,最好的解决方法当然是使用哈希表,但令人非常不爽的是C++标准里是没有 哈希表的(java里有).网上有人用ext下的hash_map,但毕竟不是C++标准里的, 用起来怪怪的,搞不好换个环境就跑不起来了(像Linux和Windows下使用就不一样). 所以,一般用一个数组模拟一下就好了.但,这里要注意一个问题,

【python cookbook】【数据结构与算法】10.从序列中移除重复项且保持元素间顺序不变

问题:从序列中移除重复的元素,但仍然保持剩下的元素顺序不变 解决方案: 1.如果序列中的值时可哈希(hashable)的,可以通过使用集合和生成器解决. 2.如果序列时不可哈希的,想要去除重复项,需要对上述代码稍作修改: key参数的作用是指定一个函数用来将序列中的元素转化为可哈希的类型,如此可以检测重复项.

[华为机试练习题]24.删除链表中的重复节点、剩余节点逆序输出

题目 描述: 题目描述: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容重复的节点(重复的节点全部删除),剩余的节点逆序倒排. 要求实现函数: void vChanProcess(strNode * pstrIn,strNode * pstrOut); [输入] pstrIn:输入一个不带头节点的单向链表 [输出] pstrOut:删除内容重复的节点(重复的节点全部删除),剩余节点逆序输出(不带头节点,链表第一个节点的内存已经申请). [注意]只需要完成该函数功能算法,中

[LeetCode] Remove Duplicate Letters 移除重复字母

Given a string which contains only lowercase letters, remove duplicate letters so that every letter appear once and only once. You must make sure your result is the smallest in lexicographical order among all possible results. Example: Given "bcabc&q

18 如何从一个数组中移除重复的元素

两种方法 (1) 使用LINQ (2) 使用List static void RemoveDups(string[] myStringArray) { // LINQ string[] str = myStringArray.Distinct().ToArray(); // Array to List to Array List<String> myStringList = new List<string>(); foreach (string s in myStringArray

DataFrame基本操作 &lt;三&gt; 计算名次,移除重复数据,数据替换,划分区间,分组统计(变成类)

生成一个实例 df5 = DataFrame({'b': [4.3, 7, -3, 2], 'a': [0, 1, 0, 1], 'c': [-2, 5, 8, -2.5]}) print(df5) 运行结果 b a c 0 4.3 0 -2.0 1 7.0 1 5.0 2 -3.0 0 8.0 3 2.0 1 -2.5 计算名次 print(df5.rank() ) # 按行计算名次 print(df5.rank(axis=1)) # 按列计算名次 #这有意思了,这是计算名次,显示的结果是名次

18 删除链表的节点/重复节点

题目描述:  题目一:在O(1)时间内删除链表节点 :在给定的单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点. //链表定义 struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; 注意:输入提供了要删除节点的指针!! 测试用例: 1)功能测试(从有多个节点的链表中删除中间.头.尾节点:从只有一个节点的链表中删除唯一的节点) 2)特殊输入测试

老虎-删除排序链表中的重复节点

题目:1-1-2-3-3-3-4-5-6-6-7,删除重复节点后返回2-4-5-7 def delete_duplicate(head): h = Node(0) k = h p = head if not p or not p.next: return head q = p.next if p.val!=q.val: k.next = p k = k.next while q.next: if q.val!=p.val and q.val!=q.next.val: k.next = q k =