美文网首页我的算法笔记
删除无序单链表中值重复出现的节点

删除无序单链表中值重复出现的节点

作者: Airycode | 来源:发表于2018-08-17 11:34 被阅读40次

【题目】
给定一个无序单链表的头节点head,删除其中值重复出现的节点。
例如:1->2->3->3->4->4->2->1->1->null,删除值重复的节点之后为1->2->3->4->null.
请按一下要求实现两种方法
1.如果链表长度为N,时间复杂度达到O(N)
2.额外空间复杂度为O(1)
【解析】
方法一:利用哈希表,时间复杂度为O(N),额外空间复杂度为O(N)
具体实现:
1.生成一个哈希表,因为头结点是不用删除的节点,所以将头节点值放入哈希表。
2.从头节点的下一个节点开始往后遍历节点,假设当前遍历到cur节点,先检查cur的值是不是在哈希表中,如果在,说明cur节点的值是之前出现过的,就将cur节点删除,删除的方式是将最近一个没有被删除的节点pre链接到cur的下一个节点,即pre.next = cur.next.如果不在,将cur节点的值加入哈希表,同时令pre=cur,即更新最近一个没有被删除的节点

package 删除无序链表中的值重复出现的节点;

import java.util.HashSet;

public class Main {

    
    /**节点类*/
    public static class Node{
        public int value;
        public Node next;
        
        public Node(int data){
            this.value = data;
        }
    }
    
    /**哈希表删除重复节点*/
    
    public static void removeRep1(Node head){
        if (head == null) {
            return;
        }
        HashSet<Integer> set = new HashSet<Integer>();
        Node pre = head;
        Node cur = head.next;
        set.add(head.value);
        
        while (cur != null) {
            if (set.contains(cur.value)) {
                pre.next = cur.next;
            } else {
                set.add(cur.value);
                pre = cur;
            }
            cur = cur.next;
        }
        
        
        
    }
    
    
    
    public static void main(String[] args) {
        Node head = new Node(1);
        Node head2 = new Node(2);
        Node head3 = new Node(3);
        Node head4 = new Node(3);
        Node head5 = new Node(5);
        Node head6 = new Node(5);
        Node head7 = new Node(5);
        Node head8 = new Node(5);
        head.next = head2;
        head2.next = head3;
        head3.next = head4;
        head4.next = head5;
        head5.next = head6;
        head6.next = head7;
        head7.next = head8;
        removeRep1(head);
        print(head);
        
    }



    private static void print(Node head) {
        if (head == null) {
            return ;
        } 
        Node cur = head;
        while (cur != null) {
            System.out.print(cur.value+"->");
            cur = cur.next;
        }
        System.out.println();
        
    }
    
    
    
}

方法二:


image.png
/**选择删除节点*/
    public static void removeRep2(Node head){
        Node cur = head;
        Node pre = null;
        Node next = null;
        while (cur != null) {
            pre = cur;
            next = cur.next;
            while (next != null) {
                if (cur.value == next.value) {
                    pre.next = next.next;
                } else {
                    pre = next;
                }
                next = next.next;
            }
            cur = cur.next;
        }
    }

相关文章

  • 链表-链表节点的删除

    场景 1 链表无序,有重复节点,删除链表中值为data的节点。思路:链表的删除分为“头删”和“中间尾删” 头删:头...

  • 删除无序单链表中值重复出现的节点

    【题目】给定一个无序单链表的头节点head,删除其中值重复出现的节点。例如:1->2->3->3->4->4->2...

  • Day 2 删除无序链表中的重复节点

    算法 Day2 删除无序链表中的重复节点,保留一个 给定一个无序单向链表的头节点,删除内部的重复节点,使其内部节点...

  • 32.删除链表中重复的节点

    题目:链表是排序的,删除链表中值相同的所有节点,且不保留重复值的节点 思路:因为链表是排序的,重复值的节点肯定是相...

  • 027-Remove Duplicates from Sorte

    描述 在一个排序单链表中,删除节点值重复出现的节点,保证每个节点的值只出现一次。 分析 单链表中可以访问到当前节点...

  • 单向链表算法

    单向链表 反转单向链表 单链表查找倒数第k个节点 单链表递归倒序打印 单链表排序 单链表删除重复节点

  • 算法相关笔记,持续更新中...

    单链表 1.删除单链表中的指定节点: 2.单链表中删除指定数值的节点方法一:利用栈 3.单链表中删除指定数值的节点...

  • 删除链表中重复的节点

    删除链表中重复的节点在一个排序的链表中,如何删除重复的节点?

  • 1.单链表常用操作

    1.删除单链表中的指定节点 2.删除单链表中指定值的节点 (1). 利用栈删除单链表指定值的节点 (2). 用普通...

  • 18-删除链表节点、删除链表重复节点

    1. 删除链表节点 2. 删除链表中的重复节点 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没...

网友评论

    本文标题:删除无序单链表中值重复出现的节点

    本文链接:https://www.haomeiwen.com/subject/qvyzpftx.html