《BM16 删除有序链表中重复的元素-II》 JavaScript实现

题目描述

给出一个升序排序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1→2→3→3→4→4→5, 返回1→2→5.
给出的链表为1→1→1→2→3, 返回2→3.

数据范围:链表长度 0≤n≤10000,链表中的值满足 ∣val∣≤1000

要求:空间复杂度O(n),时间复杂度O(n)

进阶:空间复杂度O(1),时间复杂度O(n)

解题思路

判断链表是否为空,或链表只有一个元素,声明一个新节点newHead指向链表头部,令prev指针指向该节点,current指向head。判断当前节点的下一节点和当前节点元素内容是否相同,直到遇到不相同的元素,当前元素的next指向该不相同元素

代码

/*
 * function ListNode(x){
 *   this.val = x;
 *   this.next = null;
 * }
 */

/**
  * 
  * @param head ListNode类 
  * @return ListNode类
  */
function deleteDuplicates( head ) {
    // 判断链表是否为空,或链表只有一个元素
    if(!head || !head.next) return head;
    // 声明一个新节点newHead指向链表头部,没有节点指向头部的话,第一个节点重复就无法删除
    let newHead = new ListNode(-1);
    newHead.next = head;
    let current = head;
    let prev = newHead;
    //判断当前节点的下一节点和当前元素内容是否相同,直到遇到不相同的元素,当前元素的next指向该不相同元素
    while (current&&current.next) {
        if(current.val === current.next.val){
            while(current.val === current.next.val) {
                current.next = current.next.next;
                if(!current.next){
                    break;
                }
            }
            prev.next = current.next;
            current = prev.next;
        }else {
            prev = current;
            current = current.next;
        }
    }
    return newHead.next;
    //返回newHead.next
    
}
module.exports = {
    deleteDuplicates : deleteDuplicates
};

猜你喜欢

转载自blog.csdn.net/qq_42101569/article/details/126494205
今日推荐