首页 > 编程语言 >每日算法之删除链表中重复的结点

每日算法之删除链表中重复的结点

时间:2023-01-01 19:22:28浏览次数:38  
标签:结点 ListNode cur step next 链表 算法 pHead

JZ76 删除链表中重复的结点

题目

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 
例如,链表 1->2->3->3->4->4->5  处理后为 1->2->5

方法1 哈希表进行删除

思路

算法实现

LinkedHashMap实现顺序插入,不过查询速度会比较慢

具体做法:
    step 1:用哈希表统计每个字符的次数。
    step 2:在put前进行判断,如果有值则在原有的值进行+1,没有则默认值+1。
    step 3:对map进行遍历,对计数为1的值进行创建ListNode对象,然后拼接成一个链表。

代码

package mid.JZ76删除链表中重复的结点;

import java.util.LinkedHashMap;

class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
public class Solution {
    /**
     * 运行时间     62ms
     * 占用内存     11416KB
     * @param pHead
     * @return
     */
    public ListNode deleteDuplication(ListNode pHead) {
        if (pHead == null) {
            return null;
        }
        LinkedHashMap<Integer, Integer> map = new LinkedHashMap<>();
        while(pHead != null) {
            map.put(pHead.val, map.getOrDefault(pHead.val, 0) + 1);
            pHead = pHead.next;
        }
        ListNode head = new ListNode(-1);
        ListNode p = head;
        for (Integer o : map.keySet()) {
            if (map.get(o) == 1) {
                p.next = new ListNode(o);
                p = p.next;
            }
        }
        p.next = null;
        return head.next;
    }


}

方法2 直接比较删除

思路

算法实现

这是一个升序链表,重复的节点都连在一起,我们就可以很轻易地比较到重复的节点,
然后将所有的连续相同的节点都跳过,连接不相同的第一个节点

具体做法:
    step 1:给链表前加上表头,方便可能的话删除第一个节点。
            ListNode res = new ListNode(0);
            //在链表前加一个表头
            res.next = pHead;                
    step 2:遍历链表,每次比较相邻两个节点,如果遇到了两个相邻节点相同,则新开内循环将这一段所有的相同都遍历过去。
    step 3:在step 2中这一连串相同的节点前的节点直接连上后续第一个不相同值的节点。
    step 4:返回时去掉添加的表头。

代码

package mid.JZ75字符流中第一个不重复的字符;

import java.util.HashMap;
import java.util.Map;

public class Solution2 {
    StringBuilder sb = new StringBuilder();
    Map<Character,Integer> map = new HashMap<>();

    //Insert one char from stringstream
    public void Insert(char ch) {
        sb.append(ch);
        map.put(ch, map.getOrDefault(ch, 0) + 1);
    }

    //return the first appearence once char in current stringstream

    /**
     * 运行时间     13ms
     * 占用内存     9952KB
     * @return
     */
    public char FirstAppearingOnce() {
        for (int i = 0; i < sb.length(); i++) {
            if (map.get(sb.charAt(i)) == 1) {
                return sb.charAt(i);
            }
        }
        return '#';
    }
}

方法3 哈希表+字符串(推荐使用)

思路

算法实现

除了使用字符串记录字符流,还可以用队列记录字符流,每次插入的时候,只需要将第一次出现的字符加入到队列中,然后正常计数。
查找第一个不重复出现的字符的时候,从队首开始查询哈希表,
如果出现次数为1,则返回该字符,如果不为1,则从队首将其弹出。

具体做法:
    step 1:准备一个队列来记录输入的字符流,用哈希表统计每个字符的次数,二者都是全局变量。
    step 2:在Insert函数中对输入的字符,加到队列最后,然后统计出现次数。
    step 3:在FirstAppearingOnce函数中,不断检查队首元素直到队列为空,队首出现次数为1次,就返回,
    队首出现次数不为1就弹出。,则返回#。

代码

package mid.JZ76删除链表中重复的结点;

public class Solution2 {
    /**
     *
     运行时间   54ms
     占用内存   11256KB
     * @param pHead
     * @return
     */
    public ListNode deleteDuplication(ListNode pHead) {
        if (pHead == null) return null;

        ListNode res = new ListNode(0);
        res.next = pHead;
        ListNode cur = res;
        while(cur.next != null && cur.next.next != null) {
            if (cur.next.val == cur.next.next.val) {
                int temp = cur.next.val;
                while(cur.next != null && temp == cur.next.val) {
                    cur.next = cur.next.next;
                }
            } else {
                cur = cur.next;
            }
        }
        return res.next;
    }
}

标签:结点,ListNode,cur,step,next,链表,算法,pHead
From: https://www.cnblogs.com/loongnuts/p/17018448.html

相关文章

  • 贪心算法Dijkstra
    Dijkstra最短路径问题:给定一个带权有向图G=(V,E,W),同时给定一个源点u(u∈V),我们要找出从源点u出发到其它各点的最短路径距离,并得出这些最短路径的具体路径......
  • (有序)单向链表的去重(C语言)
    单向链表的去重问题描述及分析给定一个有序的链表,去除重复出现的元素,使每个元素只出现一次。例如一个单向链表为1->1->2->2->3->4->4->∅,那么去重后得到的单向链表为......
  • EM算法之求解三硬币模型
    ......
  • 黏菌优化算法SMA(Matlab完整代码实现)求解热电联产经济调度问题的改进遗传与粒子群算法S
    黏菌优化算法SMA在电力系统中虽然有所应用,但是发表的文章还是比较少的,所有这个算法的应用空间还很广,推荐推荐:对于这两篇文献,我写过相关的文章,先回顾一下,然后再开始今天的话......
  • 概率算法(用于抽奖等场景)
    letgifts=[{"name":"mac","prop":1},{"name":"红米","prop":10},{"name":"u盘","prop":40},{"name":&qu......
  • 算法之Floyd-Warshall算法【c++】【图论】【最短路】
    我们作为刚学图论的小蒟蒻,先接触到的算法一定是图上最短路径算法。而最短路算法中最简单的当属Floyd-Warshall算法。下面是一些基本介绍:​该算法可以计算图上任意两点间......
  • 刷刷刷Day4|19.删除链表的倒数第N个节点
    19.删除链表的倒数第N个节点LeetCode题目要求给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。示例:输入:head=[1,2,3,4,5],n=2输出:[1,2,3,5]解题思......
  • 聚类算法-最大最小距离算法(实例+代码)
    聚类算法-最大最小距离算法(实例+代码)目录​​聚类算法-最大最小距离算法(实例+代码)​​​​一、最大最小距离算法基本思想​​​​二、算法实现步骤​​​​1.最大最小距......
  • 一文详尽之支持向量机算法!
     Datawhale干货 作者:小一,Datawhale优秀学习者寄语:本文介绍了SVM的理论,细致说明了“间隔”和“超平面”两个概念;随后,阐述了如何最大化间隔并区分了软硬间隔SVM;同时,介绍了SV......
  • SVM算法在项目实践中的应用!
     Datawhale干货 作者:苏丽敏,Datawhale优秀学习者,北理工计算机硕士支持向量机(SupportVectorMachine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模......