题解 | #删除有序链表中重复的元素-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; } }