題目:
在一個排序的鏈表中,如何刪除重複的結點?
實現
public class Solution57 {
public static Node deleteDuplicateNode(Node head){
if (head == null) {
return null;
}
// // 只有一個結點
// if (head.next == null) {
// return head;
// }
// 臨時的頭結點
Node root = new Node();
root.next = head;
// 記錄前驅結點
Node prev = root;
// 記錄當前處理的結點
Node cur_node = head;
while (cur_node != null && cur_node.next != null) {
// 有重複結點,與node值相同的結點都要刪除
if (cur_node.value == cur_node.next.value) {
// 找到下一個不同值的節點,注意其有可能也是重複節點
while (cur_node.next != null && cur_node.next.value == cur_node.value) {
cur_node = cur_node.next;
}
// 指向下一個節點,prev.next也可能是重複結點
// 所以prev不要移動到下一個結點
prev.next = cur_node.next;
}
// 相鄰兩個值不同,說明node不可刪除,要保留
else {
prev.next = cur_node;
prev = prev.next;
}
cur_node = cur_node.next;
}
return root.next;
}
public static void main(String[] args) {
test01();
test02();
test03();
test04();
test05();
test06();
test07();
test08();
test09();
test10();
}
// 1->2->3->3->4->4->5
private static void test01() {
Node n1 = new Node(1);
Node n2 = new Node(2);
Node n3 = new Node(3);
Node n4 = new Node(3);
Node n5 = new Node(4);
Node n6 = new Node(4);
Node n7 = new Node(5);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
n5.next = n6;
n6.next = n7;
System.out.println("test1");
Node result = deleteDuplicateNode(n1);
printListNode(result);
}
// 1->2->3->4->5->6->7
private static void test02() {
Node n1 = new Node(1);
Node n2 = new Node(2);
Node n3 = new Node(3);
Node n4 = new Node(4);
Node n5 = new Node(5);
Node n6 = new Node(6);
Node n7 = new Node(7);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
n5.next = n6;
n6.next = n7;
System.out.println("test2");
Node result = deleteDuplicateNode(n1);
printListNode(result);
}
// 1->1->1->1->1->1->2
private static void test03() {
Node n1 = new Node(1);
Node n2 = new Node(1);
Node n3 = new Node(1);
Node n4 = new Node(1);
Node n5 = new Node(1);
Node n6 = new Node(1);
Node n7 = new Node(2);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
n5.next = n6;
n6.next = n7;
System.out.println("test3");
Node result = deleteDuplicateNode(n1);
printListNode(result);
}
// 1->1->1->1->1->1->1
private static void test04() {
Node n1 = new Node(1);
Node n2 = new Node(1);
Node n3 = new Node(1);
Node n4 = new Node(1);
Node n5 = new Node(1);
Node n6 = new Node(1);
Node n7 = new Node(1);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
n5.next = n6;
n6.next = n7;
System.out.println("test4");
Node result = deleteDuplicateNode(n1);
printListNode(result);
}
// 1->1->2->2->3->3->4->4
private static void test05() {
Node n1 = new Node(1);
Node n2 = new Node(1);
Node n3 = new Node(2);
Node n4 = new Node(2);
Node n5 = new Node(3);
Node n6 = new Node(3);
Node n7 = new Node(4);
Node n8 = new Node(4);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
n5.next = n6;
n6.next = n7;
n7.next = n8;
System.out.println("test5");
Node result = deleteDuplicateNode(n1);
printListNode(result);
}
// 1->1->2->3->3->4->5->5
private static void test06() {
Node n1 = new Node(1);
Node n2 = new Node(1);
Node n3 = new Node(2);
Node n4 = new Node(3);
Node n5 = new Node(3);
Node n6 = new Node(4);
Node n7 = new Node(5);
Node n8 = new Node(5);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
n5.next = n6;
n6.next = n7;
n7.next = n8;
System.out.println("test6");
Node result = deleteDuplicateNode(n1);
printListNode(result);
}
// 1->1->2->2->3->3->4->5->5
private static void test07() {
Node n1 = new Node(1);
Node n2 = new Node(1);
Node n3 = new Node(2);
Node n4 = new Node(2);
Node n5 = new Node(3);
Node n6 = new Node(3);
Node n7 = new Node(4);
Node n8 = new Node(5);
Node n9 = new Node(5);
n1.next = n2;
n2.next = n3;
n3.next = n4;
n4.next = n5;
n5.next = n6;
n6.next = n7;
n7.next = n8;
n8.next = n9;
System.out.println("test7");
Node result = deleteDuplicateNode(n1);
printListNode(result);
}
// 1->2
private static void test08() {
Node n1 = new Node(1);
Node n2 = new Node(2);
n1.next = n2;
System.out.println("test8");
Node result = deleteDuplicateNode(n1);
printListNode(result);
}
// 1
private static void test09() {
Node n1 = new Node(1);
System.out.println("test9");
Node result = deleteDuplicateNode(n1);
printListNode(result);
}
// null
private static void test10() {
System.out.println("test10");
Node result = deleteDuplicateNode(null);
printListNode(result);
}
public static void printListNode(Node head){
if(head==null){
System.out.print(" 鏈表爲空");
}
while (head!=null){
System.out.print(" "+head.value);
head = head.next;
}
System.out.print("\n");
}
}