【剑指offer-JZ76】删除链表中重复的结点

74 阅读1分钟

递增链表中删除重复的。重复的节点值保留最开始的那一个。

public static Node dup(Node head) {
    Node curr = head.next;
    while (curr != null) {
        Node next = curr.next;
        if (next != null && curr.value == next.value) {
            curr.next = next.next;
        } else {
            curr = curr.next;
        }
    }
    return head.next;
}

递增链表中删除重复的。不保留重复的节点值。


注意:必须有头结点,否则不好处理刚开始就连续重复的情况。如果传进来的是首结点,那就在前面现造一个头结点。


思路:设置 prev ,curr 指针, prev 指针指向重复节点前面的那个结点,而curr指针相当于工作指针,一直往后面搜索。

public static Node dup(Node head) { 
    Node prev = head;
    Node curr = prev.next;
    while (curr != null) {

        if (curr.next != null && curr.value == curr.next.value) {
            curr = curr.next;
            while (curr.next!=null && curr.value==curr.next.value){
                curr = curr.next;
            }


            curr = curr.next;
            prev.next =curr;

        } else {

            prev=curr;
            curr = curr.next;
        }
    }
    return head.next;   // 这里如果写pHead,在牛客网的编译器中会有一部分样例不通过
}

造头结点的方法:

public static Node dup(Node first) {  // 传进来首结点

    Node head  = new Node(0);   // 生成头结点
    head.next=first;            // 头结点指向首结点

    Node prev = head;
    Node curr = first;
    while (curr != null) {

        if (curr.next != null && curr.value == curr.next.value) {
            curr = curr.next;
            while (curr.next!=null && curr.value==curr.next.value){
                curr = curr.next;
            }


            curr = curr.next;
            prev.next =curr;

        } else {

            prev=curr;
            curr = curr.next;
        }
    }
    return head.next;   // 这里如果写pHead,在牛客网的编译器中会有一部分样例不通过
}



题源:www.nowcoder.com/practice/fc…