《剑指offer》 链表第八题: 删除链表中连续重复的节点。

题目描述:

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。

思路:

这题的关键在于判断循环的条件,一定要捋清楚,while循环是总的一个循环,而while里的另一个while循环才是判断这个节点的值是否连续重复,如果重复,则一直将当前重复的节点指向下一个,直到下一个节点与当前节点不相等为止。

解法:

package 链表;


class ListNode1 {
    class Node {
        int val;
        Node next;

        Node(int val) {
            this.val = val;
        }
    }

    public Node oper(Node node1) {
        if (node1 == null)
            return null;
        Node head = new Node(-1);
        head.next = node1;           //这一句保证链表的连贯性,不可以没有
        Node pre = head;
        Node last = head.next;

        while (last != null) {
            if (last.next != null && last.val == last.next.val) {
                while (last.next != null && last.val == last.next.val) {
                    last = last.next;
                }
                pre.next = last.next;       //切记不是pre=last.next;
                last = last.next;
            } else {
                pre = pre.next;
                last = last.next;
            }
        }
        return head.next;
    }


    public static void main(String[] args) {
        ListNode1 list = new ListNode1();

        Node node1 = list.new Node(11);
        Node node2 = list.new Node(22);
        Node node3 = list.new Node(22);
        Node node4 = list.new Node(33);
        Node node5 = list.new Node(44);

        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;


        Node res = list.oper(node1);
        while (res != null) {
            System.out.print(res.val+" ");
            res = res.next;
        }
    }
}

运行结果:

你可能感兴趣的:(链表,数据结构)