劍指Offer-57

題目:

在一個排序的鏈表中,如何刪除重複的結點?

實現

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");
    }


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章