来自左神书中的一道题,在左神核心代码的基础上,添加了链表的构建操作,将这道题完善成了一个小Demo,和各位共勉。
问题:删除无序单链表中重复出现的节点
思路:使用HashSet进行重复判断。
核心算法:
public static void removeNode(Node head){
if(head == null){
return;
}
HashSet<Integer> set = new HashSet<Integer>();
Node pre = head;
Node cur = head.next;
set.add(pre.value);
while(cur != null){
if(set.contains(cur.value)){
pre.next = cur.next;
}else{
set.add(cur.value);
pre = cur;
}
cur = cur.next;
}
}
完整源代码:
import java.util.HashSet;
public class RemoveNodeTest {
/**
* 权兴权意-2016.11.15
* 题目:删除无序单链表中重复出现的节点
*/
public static void main(String[] args) {
Node head1 = new Node(0);
Node temp1 = head1;
for(int i = 1;i < 5;i++){
temp1.next = new Node(i);
temp1 = temp1.next;
}
for(int i = 1;i < 5;i++){
temp1.next = new Node(i);
temp1 = temp1.next;
}
printList(head1);
removeNode(head1);
printList(head1);
}
public static void removeNode(Node head){
if(head == null){
return;
}
HashSet<Integer> set = new HashSet<Integer>();
Node pre = head;
Node cur = head.next;
set.add(pre.value);
while(cur != null){
if(set.contains(cur.value)){
pre.next = cur.next;
}else{
set.add(cur.value);
pre = cur;
}
cur = cur.next;
}
}
//打印链表
public static void printList(Node head){
Node temp = head;
while(temp != null){
System.out.print(temp.value + "->");
temp = temp.next;
}
System.out.println();
}
}
输出结果:
0->1->2->3->4->1->2->3->4->
0->1->2->3->4->