【题目】给定一个无序单链表的头节点head,删除其中值重复出现的节点。
例如:1->2->3->3->4->4->2->1->1->null,删除值重复重复的节点之后为1->2->3->4->null。
请按以下要求实现两种方法:
方法1:如果链表长度为N,时间复杂度达到O(N)。
方法2:额外空间复杂度为O(1)
public class RemoveRep {
/*
* 给定一个无序单链表的头节点head,删除其中值重复出现的节点
*/
public static class Node {
public int value;
public Node next;
public Node(int value) {
this.value = value;
}
}
// 时间复杂度O(N),空间复杂度O()
public static void removeRep1(Node head) {
if (head == null) {
return;
}
HashSet<Integer> set = new HashSet<>();
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(N*N),空间复杂度O(1)
public static void removeRep2(Node head) {
if (head == null) {
return;
}
Node cur = head;
Node pre = null;
Node next = null;
while (cur != null) {
pre = cur;
next = cur.next;
while (next != null) {
if (next.value == cur.value) {
pre.next = next.next;
} else {
pre = next;
}
next = next.next;
}
cur = cur.next;
}
}
}