给定一个无序单链表的头节点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; } } }