• 剑指offer——删除链表中重复的结点


    删除链表中重复的结点

    两种方法:

    法一:不太好

    借助于HashMap,将每个结点均加入map中,key为结点值,value为boolean类型,为true表示加入了一次,false表示加入了两次及以上,

    在加入前判断map中是否已存在结点的值,

    若不存在,则加入(node.val, true)

    若存在,则加入(node.val, false)

    然后再次遍历链表,同时查找map中的key值,若为true,则放入新结点中,否则忽略

    public class Solution {
        public ListNode deleteDuplication(ListNode pHead){
            if(pHead == null || pHead.next == null) return pHead;
            HashMap<Integer, Boolean> map = new HashMap<>();
            ListNode node = pHead;
            while(node != null){
                if(map.containsKey(node.val)){
                    map.put(node.val, false);
                }else{
                    map.put(node.val, true);
                }
                node = node.next;
            }
            for(HashMap.Entry<Integer, Boolean> entry : map.entrySet()){
            }
            ListNode head = new ListNode(0);
            node = head;
            while(pHead != null){
                if(map.get(pHead.val)){
                    node.next = pHead;
                    node = node.next;
                }
                pHead = pHead.next;
            }
            node.next = null;
            node = head;
            while(node != null){
                node = node.next;
            }
            return head.next;
        }
    }
    

      

    法二:采用

    newHead,(新的头结点,用来返回)

    newNext(用来将新结点后面结点连接起来),

    先将两个结点均指向新的new ListNode(0),

    遍历链表的时候,判断链表的当前结点及下一个结点的值,

    若相等,则记录下当前结点的值val,并且开始遍历,知道当前结点值不为val时,出来,继续判断(不用记录当前结点,因为要将重复的结点全部删除)

    若不相等,则newNext = 当前结点的值

    最后一点需要注意的是,当最后一个结点是不重复的时候,是没法判断的,所以newNext = pHead即可(即是最后一个节点是重复的,那么在上面的循环中,已经将其遍历过,现在pHead指向null)

    public class Solution {
        public ListNode deleteDuplication(ListNode pHead){
            if(pHead == null || pHead.next == null) return pHead;
            ListNode newHead = new ListNode(0);
            ListNode newNext = newHead;
            while(pHead != null && pHead.next != null){
                if(pHead.val == pHead.next.val){
                    int val = pHead.val;
                    while(pHead != null && pHead.val == val){
                        pHead = pHead.next;
                    }
                }else{
                    newNext.next = pHead;
                    newNext = newNext.next;
                    pHead = pHead.next;
                }
            }
    
            newNext.next = pHead;
            return newHead.next;
        }
    }
    

      

  • 相关阅读:
    SpringBoot微服务电商项目开发实战 --- 模块版本号统一管理及Redis集成实现
    Spring Boot微服务电商项目开发实战 --- 多环境部署配置、端口号统一配置及Dubbo提供者消费者实现
    Spring Boot微服务电商项目开发实战 --- 基础配置及搭建
    Java开发面试题汇总 -- 精选版(附答案)
    springmvc用model传值到jsp页面,el表达式引用接收不到传递过来的值
    八、自定义starter
    七、Spring Boot 启动配置原理
    六、SpringBoot与数据访问
    五、Docker
    四、Spring Boot Web开发
  • 原文地址:https://www.cnblogs.com/SkyeAngel/p/8980435.html
Copyright © 2020-2023  润新知