leetCode: 82. 删除排序链表中的重复元素 II

109 阅读1分钟

题目

给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。

解题思路

因为是一直的有序列表,所以只需要循环一次即可,设定虚拟头节点指向head,再定义一个p节点指向虚拟头节点,当next节点和next节点的next节点有值时进行循环,每次循环判断next节点是否与下一个节点相等,如果相等,则循环删除后面可能相等的值(删除方法是让当前节点的next节点指向next节点的next节点);不相等,则直接move到后一节点

var deleteDuplicates = function(head) {
    // 老规矩,非空判断
    if(!head) return head;
    // 定义虚拟头节点指向head节点
    const vNode = new ListNode(0, head);
    // 定义开始节点
    let p = vNode;
    while(p.next && p.next.next) {
        // next节点和next.next节点值相等时,进入删除操作
        if (p.next.val === p.next.next.val) {
            let x = p.next.val;
            // 从next节点值与第一个值相等开始删除,直到不相等为止
            while(p.next && p.next.val === x) {
                p.next = p.next.next;
            }
        } else {
            // 不相等,则进入下一个循环
            p = p.next;
        }
    }
    
    // 返回虚拟头几点的next,即head;
    return vNode.next;
};