【LeetCode】 JavaScript实现 链表删除节点(重复、指定等情况) 题型汇总

面试题 02.01. 移除重复节点

原题链接:面试题 02.01. 移除重复节点
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var removeDuplicateNodes = function(head) {
   
  
};

解题思路:

①哈希表法

  • 利用哈希表依次存储结点
  • 用set.has()方法判断是否重复,如果重复通过指向进行删除,并后移
  • 不重复则通过set.add()存储,并后移
var removeDuplicateNodes = function(head) {
   
    //利用哈希
    if(head==null){
   
        return head;
    }
    var set=new Set();
    set.add(head.val);

    var prev=head;      //head赋给prev
    var curr=head.next; //head.next赋给curr

    while(curr!=null){
   
        if(set.has(curr.val)){
    //如果当前结点重复
            prev.next=curr.next; //让prev的next指向curr的next 进行删除
            curr=curr.next; //curr后移
        }else{
   
            set.add(curr.val); //第一次出现 ,存储到set里
            prev=prev.next;    //prev和curr均后移
            curr=curr.next;
        }
    }
    return head;
};

②利用双指针法

  • 声明p、q指针,分别指向head和p
  • 将p指针的位置先固定,不断移动q指针进行扫描与p的值比较,相同则删除 ,否则q指向后移
  • 一轮循环完后,让p向后移,判断下一个结点
  • 时间复杂度较高,执行效率慢
var removeDuplicateNodes = function(head) {
   
    //双指针
    var p=head;
    while(p!=null){
   
        var q=p; //将p指针赋给q
        while(q.next!=null){
   
            if(q.next.val==p.val){
    //如果后面的q有和固定的p有重复
                q.next=q.next.next; //删除重复
            }else{
   
                q=q.next;
            }
        }
        p=p.next; //让p向后移,判断下一个结点
    }
    return head;
};

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

原题链接:83. 删除排序链表中的重复元素
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var  deleteDuplicates = function (head) {
   
 
};

解题思路:

注意: 与上题的不同点在于,该链表已经按升序排列,所以重复元素一定相邻,比无序排列的链表删除重复元素简单

  • 让p指针指向head 并且判断p的val和p.next.val是否相等
  • 如果相等则为重复并删除 , 否则,p指针指向下一个元素
var  deleteDuplicates 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值