欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-04-16 09:39:20
...

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

import java.util.HashSet;
//删除无序链表中值重复出现的节点
public class DelSameList{
    
    //节点的定义
    public static class Node{
       int value;
       Node next;

       public Node(int data)
       {
       	this.value=data;
       }

    }
      
     //(一、哈希表法 时间复杂度O(n),空间复杂度O(n))删除无序链表中值重复出现的节点
    public static void delSameList(Node head)
    {
        if(head==null)
        {
        	return ;
        }
        HashSet<Integer> set=new HashSet<Integer>(); //存储不相同节点的值
        Node p=head;
        Node cur=head.next;
        set.add(head.value); //首先加入头节点
        while(cur!=null)
        {
             if(set.contains(cur.value))
             {
             	p.next=cur.next; //删除cur这个节点
             }else{
             	set.add(cur.value);
             	p=cur;
             }
        	cur=cur.next;
        }
    }
    
     //(一、选择排序法 时间复杂度O(n*n),空间复杂度O(1))删除无序链表中值重复出现的节点
    public static void delSameList2(Node head)
    {
    	if(head==null)
    	{
    		return;
    	}
        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; //删除next节点
        	 	}
        	 	else
        	 	{
        	 		pre=next;   //pre向下移动一个节点
        	 	}
        	 	next=next.next;
        	 }
        	 cur=cur.next;
        }
        
    }
    //打印链表
    public static void PrintList(Node head)
    {
    	while(head!=null)
    	{
    		System.out.print(head.value+" ");
    		head=head.next;
    	}
    	System.out.println();
    }
	public static void main(String[]args)
	{
	    Node node=new Node(1);
		node.next=new Node(2);
		node.next.next=new Node(3);
		node.next.next.next=new Node(3);
		node.next.next.next.next=new Node(4);
		node.next.next.next.next.next=new Node(4);
		node.next.next.next.next.next.next=new Node(2);
		node.next.next.next.next.next.next.next=new Node(1);
		node.next.next.next.next.next.next.next.next=new Node(1);
        PrintList(node);
		delSameList2(node); //删除重复的节点
        PrintList(node);

	}
}

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