头图

删除排序链表中的重复元素 II

题目描述:存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。

返回同样按升序排列的结果链表。

示例说明请见LeetCode官网。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl...
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:链表遍历

首先,声明一个新的链表头结点newHead,last指向新的头结点newHead,cur指向老的头结点head,然后遍历链表head,遍历过程如下:

  • 声明一个boolean变量isRepeated来标识当前节点是否是重复节点;
  • 声明next为cur的next节点,通过循环过程找到下一个跟cur节点的数字不同的节点,并且判断当前节点是否是重复的并更新isRepeated;
  • 如果isRepeated为true,说明当前节点是重复的,则跳过这个重复节点,然后处理下一个节点;
  • 如果isRepeated为false,说明后面的节点没有和当前节点相同的,将当前节点加入到last的next节点中,然后处理下一个节点。

最后返回newHead的next节点即为结果。

public class LeetCode_082 {
    public static ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode newHead = new ListNode(-1);
        ListNode last = newHead, cur = head;
        while (cur != null) {
            // 当前节点是否是重复的标识
            boolean isRepeated = false;
            ListNode next = cur.next;
            // 找到下一个跟cur节点的数字不同的节点,并且判断当前节点是否是重复的
            while (next != null && next.val == cur.val) {
                isRepeated = true;
                next = next.next;
            }
            if (isRepeated) {
                // 如果当前节点是重复的,则跳过这个重复节点
                cur = next;
            } else {
                // 如果当前节点不是重复的,则作为last的下一个节点
                last.next = new ListNode(cur.val);
                last = last.next;
                cur = next;
            }
        }
        return newHead.next;
    }

    public static void main(String[] args) {
        ListNode head = new ListNode(1);
        head.next = new ListNode(2);
        head.next.next = new ListNode(2);

        ListNode result = deleteDuplicates(head);
        while (result != null) {
            System.out.print(result.val + " ");
            result = result.next;
        }
    }
}
【每日寄语】 你若等待,清风自来。等待可能是一阵风,等待的有可能是一个机会,等待的有可能是一个人,但你终归你得等,你不等,那个风是不会来的。

醉舞经阁
1.8k 声望7.1k 粉丝

玉树临风,仙姿佚貌!