删除无序链表中重复的元素
方法1:使用哈希表,时间复杂度O(n),空间复杂度O(n)
方法2:类似选择排序的过程,时间复杂度O(n^2),空间复杂度O(1);
方法1
过程如下:
1. 生成一个哈希表,因为头节点不用删除,所以先将头节点存入哈希表中
2. 从头节点的下一个节点开始遍历,每遍历到一个节点,记录当前节点cur和它上一个节点pre。先检查cur是否在哈希表中,如果存在则删除cur节点,如果不存在则存入哈希表中。操作完之后移动到下一个节点。
代码块
public class Node {
public int val;
public Node next;
public Node (int val){
this.val=val;
}
}
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);
while(cur!=null){
if(set.contains(cur.val)){
pre.next=cur.next;
}else {
pre=cur;
set.add(cur);
}
cur=cur.next;
}
}
方法2
依次检查每个节点的重复值,首先是头节点,记录头节点为当前节点cur,遍历头节点之后的所有节点,如果有相同的节点则删除。检查完头节点接着检查下一个节点,直到检查完所有节点为止。
代码块
public class Node {
public int val;
public Node next;
public Node (int val){
this.val=val;
}
}
public void removeRep2(Node head){
if(head==null) return ;
Node pre=null;
Node cur=head;
Node next=null;
while(cur!=null){
pre=cur;
next=cur.next;
while(next!=null){
if(cur.val==next.val){
pre.next=next.next;
}else {
pre=next;
}
next=next.next;
}
cur=cur.next;
}
}