问题描述:
现有一个无序单链表,其中存在重复元素,实现一个算法来删除重复出现的元素,最终使得单链表中所有元素仅出现一次。
思路分析:
我们有两种思路:
(1)利用hash表进行去重。
(2)利用双重循环去重。时间复杂度为O(N*N)。
具体见代码注释:
package List;
import java.util.HashSet;
import java.util.Scanner;
public class Removerepare {
//链表删除重复元素
private static class Node{//单链表结点定义
private Node next;
private Object data;
public Node(Object data) {//构造器
this.data = data;
}
}
public static void remove2(Node first)//不利用辅助空间删除,二重循环解决
{
Node p=first.next;//哨兵
while (p!=null)
{
Node p1=p.next;//游标
Node pre=p;
while (p1!=null)
{
if (p1.data==p.data)//若出现重复
{
pre.next=p1.next;
}
p1=p1.next;
pre=pre.next;
}
p=p.next;
}
}
public static void remove(Node first)//利用hash去重
{
HashSet hashSet=new HashSet();//建立hash表
Node p=first.next;
Node pre=first;
while (p!=null)
{
if (hashSet.contains(p.data))//删除重复元素
{
pre.next=p.next;
}
else
{
hashSet.add(p.data);//加入到hash表中
}
pre=pre.next;
p=p.next;
}
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);//链表元素输入
int len=scanner.nextInt();//输入要输入元素的个数
int []a=new int [len];
for (int i = 0; i <len ; i++) {
a[i]=scanner.nextInt();
}
Node first=new Node(null);//建立哑元
Node p=first;//数组转链表
for (int i = 0; i <len ; i++) {
p.next=new Node(a[i]);
p=p.next;
}
// remove(first);//hash去重
remove2(first);//二重循环去重
Node p1=first.next;//链表打印
while (p1!=null)
{
System.out.println(p1.data);
p1=p1.next;
}
}
}
运行结果如下: