删除无序链表中值重复出现的节点
程序员文章站
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);
}
}