算法总结之 删除无序单链表中重复出现的节点
给定一个无序单链表的头节点head,删除其中重复出现的节点
要求:
方法1 长度N 时间复杂度O(N)
方法2 额外空间复杂度O(1)
方法一
1 生成哈希表 头节点是不用删除的节点 所以首先将头放入哈希表
2 从头节点的下一个节点开始往后遍历 cur,检查是否在哈希表中,在则删除,不在 加入 同时令pre=cur 即更新最近一个没有被删除的节点
package TT;
import java.util.HashSet;
public class Test107 {
public class Node{
public int value;
public Node next;
public Node(int data){
this.value=data;
}
}
public 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;
}
}
}
方法二 类似选择排序的过程,时间复杂度O(N2) 额外空间复杂度O(1)
package TT;
public class Test108 {
public class Node{
public int value;
public Node next;
public Node(int data){
this.value=data;
}
}
public 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;
}
}
}