直接上代码,相关说明见代码注释
public class Main {
/**
* 这种方法,时间复杂度,但是,有利用O(n)的辅助空间
* @param head
*/
public static void deleteDuplecate(Node head) {
TreeSet<Integer> treeSet = new TreeSet<>();
Node preNode = null;
Node curNode = head;
while (curNode != null) {
if(treeSet.contains(curNode.value)) {
preNode.next = curNode.next;
} else {
treeSet.add(curNode.value);
preNode = curNode;
}
curNode = curNode.next;
}
}
/**
* 这种方法不需要辅助空间,但是时间复杂度为O(n2)
* @param head
*/
public static void deleteDuplecate2(Node head) {
while (head != null) {
Node preNode = head.next;
Node temp = head.next;
while (temp != null) {
if(temp.value == head.value) {
preNode.next = temp.next;
} else {
preNode = temp;
}
temp = temp.next;
}
}
}
public static void main(String[] args) {
Node node1 = new Node(4);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
Node node5 = new Node(5);
Node node6 = new Node(6);
Node node7 = new Node(7);
Node node8 = new Node(3);
Node node9 = new Node(5);
node1.next = node3;
node3.next = node9;
node9.next = node5;
node5.next = node8;
node8.next = node2;
node2.next = node4;
node4.next = node6;
node6.next = node7;
System.out.println("before -------------------------- ");
printList(node1);
deleteDuplecate(node1);
System.out.println("after -------------------------- ");
printList(node1);
}
/**
* 打印链表
*/
public static void printList(Node head) {
Node temp = head;
while (temp != null) {
System.out.println(temp.value);
temp = temp.next;
}
}
}
控制面板打印如下
before --------------------------
4
3
5
5
3
2
4
6
7
after --------------------------
4
3
5
2
6
7