题解 | #删除有序链表中重复的元素-II#

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

https://www.nowcoder.com/practice/71cef9f8b5564579bf7ed93fbe0b2024

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @return ListNode类
     */
    public ListNode deleteDuplicates (ListNode node) {
        if(node==null){
            return null;
        }
        ListNode vnode = new ListNode(0); // 虚拟节点, 解决边界问题
        vnode.next = node;
        ListNode pre = vnode; // 标记最近一个可选元素
        ListNode left = node; 
        ListNode right = node.next;
        boolean flag = false;
        while (right != null) { 
            if (left.val == right.val) { // 如果相邻元素相等, 则标记需要删除一次, 左不动, 右挪一步
                right = right.next;
                flag = true;
            } else { // 如果相邻元素不等, 需要分情况
                if (flag) { // 如果需要删除一次, 说明是当前重复元素走完了, 要换元素了
                    pre.next = right; // 此时直接跳过重复元素, 等同删除
                    left = right; // 左右都挪一步
                    right = right.next;
                    flag=false; // 删除重复元素后, 标记清空
                } else { // 如果不需要删除一次, 说明没有重复元素, 只需要3个指针都挪一步就行了
                    pre = pre.next;
                    left = left.next;
                    right = right.next;
                }
            }
        }
        if (flag) {// 如果元素走完了, 还有个删除标识, 说明最后几个都是重复元素, 此时抛弃pre后面的所有重复元素即可
            pre.next = null;
        }

        return vnode.next;
    }
}

全部评论

相关推荐

2024-12-26 20:46
复旦大学 C++
国棉17厂丶小王:拿了offer的那个周末晚上去网吧通宵,去网吧不知道玩什么刷了lc的每日一题,然后试着第一次打开了三角洲行动,从此少了一个已经刷了700道题的lc用户,但是烽火地带多了一只🐭🐭
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
02-14 11:10
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务