如何从链表中删除重复数据,最易想到的方法就是遍历链表,把遍历到的值存储到一个HashTable中,在遍历过程中,若当前访问的值在HashTable中已经存在,则说明这个数据是重复的,因此可以删除。
这种方法的优点是:时间复杂度较低
缺点是:在遍历过程中需要额外的存储空间来保存已经遍历过的值。
/**
* 从链表中删除重复元素
*/
public void deleteDuplecate(){
Hashtable<Integer, Integer> table=new Hashtable<>();
Node tmp=head;
Node pre=null;
while(tmp!=null){
if (table.containsKey(tmp.data)) {
pre.next=tmp.next;
}else {
table.put(tmp.data, 1);
pre=tmp;
}
tmp=tmp.next;
}
}
另一种方法是:对链表进行双重循环遍历
外循环正常遍历链表,假设外循环当前遍历的结点为cur,内循环从cur开始遍历,若碰到与cur所指向结点值相同,则删除这个重复结点。
优点:不需要额外的存储空间
缺点:时间复杂度高
public void deleteDuplecate2(){
Node p=head;
while(p!=null){
Node q=p;
while(q.next!=null){
if (p.data==q.next.data) {
q.next=q.next.next;
}else {
q=q.next;
}
}
p=p.next;
}
}
练习:给定排序的链表,删除重复元素,只保留重复元素第一次出现的结点;
package test;
import java.util.Hashtable;
/**
* @author wyl
* @time 2018年7月4日下午5:57:28
*/
public class DeleteNode {
Node head=null;
public void addNode(int d){
Node newNode=new Node(d);
if (head==null) {
head=newNode;
return;
}
Node tmp=head;
while(tmp.next!=null){
tmp=tmp.next;
}
tmp.next=newNode;
}
public void deleteDuplecate(){
Hashtable<Integer, Integer> table=new Hashtable<>();
Node tmp=head;
Node pre=null;
while(tmp!=null){
if (table.containsKey(tmp.data)) {
pre.next=tmp.next;
}else {
table.put(tmp.data,1);
pre=tmp;
}
tmp=tmp.next;
}
}
public void printList(){
Node tmp=head;
while(tmp!=null){
System.out.print(tmp.data);
tmp=tmp.next;
}
System.out.println();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
DeleteNode t=new DeleteNode();
t.addNode(3);
t.addNode(8);
t.addNode(2);
t.addNode(8);
t.addNode(9);
t.printList();
System.out.println();
t.deleteDuplecate();
t.printList();
}
}