秒杀LeetCode题:链表题型实操(1)

112 阅读3分钟

前言

这是一篇实操刷题文章,收集了LeetCode上的基础链表题型。本类文章后续会继续更新如环形链表等进阶题型

一,移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

屏幕截图 2024-05-23 014529.png

解:

大家看这道题感觉熟不熟悉?这不就是我们在上一篇文章中学到吗,我们直接将上篇章学到的方法运用就好,这里我采用设置虚拟节点的方式。

  1. 设置一个空节点将虚拟节点实例化
  2. 将虚拟节点放置在头指针前
  3. 设置临时指针放置在虚拟指针的位置
  4. 利用临时指针循环遍历链表,当临时指针的下一个节点为空时停止遍历
  5. 如果临时指针的下一位为要删除的节点,“跳过”他的指针
  6. 否则继续往后遍历寻找
  7. 返回出新的节点头
var removeElements = function (head, val) {

    let dommyhead = new ListNode(0);
    dommyhead.next = head;

    let cur = dommyhead;

    while (cur.next != null) {
        if (cur.next.val === val) {
            cur.next = cur.next.next;
        } else {
            cur = cur.next;
        }

    }
    return dommyhead.next;

};

二,删除链表的节点

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。

返回删除后的链表的头节点。

解:

和上题如出一辙,直接秒了

var deleteNode = function (head, val) {
    let dummy = new ListNode(0);
    dummy.next = head

    let cur = head


    while (cur.next != null) {
        if (cur.next.val === val) {

            cur.next = cur.next.next

        } else {
            cur = cur.next
        }

    }

    return dummy.next
};

三,删除排序列表中的重复元素

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表  。

屏幕截图 2024-05-23 022101.png

删除重复元素 了,因为虚拟节点在头节点前面,cur从虚拟节点开始遍历,这样的情况如果用 cur.next = cur.next.next来删除节点的话,有将头节点删除的风险。如果遇到全部相同的链表,头节点的值和后续链表的值相同就会被全部删除。所以这道题如果要使用虚拟头节点的话需要再将指针往后移动一位cur.next.next = cur.next.next.next;不用虚拟头节点的话可直接将临时指针放在头指针上开始遍历。

var deleteDuplicates = function (head) {
    let cur = head;

    while (cur && cur.next) {
        if (cur.val == cur.next.val ) {
            cur.next = cur.next.next;
        } else {
            cur = cur.next;
        }

    }

    return head;

};

四,合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

屏幕截图 2024-05-23 020210.png 解:

将两个链表合并为新的升序链表首先要考虑的是两个链表的大小比较。我们把两个表定义为list1,list2;因为两个表通过大小的不同导致了排序的不同,所以这里需要一个if判断,if行使的功能的判断标准是两链表元素数值的大小。我们可以用穿针引线的方法将两个链表串起来,通过next不断向下比较。

  1. 定义虚拟节点
  2. 设置临时指针
  3. 循环遍历两个链表,指针不断向后移动
  4. 比较两链表元素的值的大小,设置指针下一步指向值小的链表
  5. 指针确定指向后递进该链表的值,重新比较大小确定指向
  6. 如果list1和list2的末尾元素相同导致产生多余元素,将他们连接到链表的末尾
  7. 给出这个新链表(不包含虚拟指针)
var mergeTwoLists = function(list1, list2) {  
    
    let dummy = new ListNode(0); 
    let cur = dummy;   
  
    while (list1 && list2) {  
        if (list1.val <= list2.val) {  
            cur.next = list1;  
            list1 = list1.next;  
        } else {  
            cur.next = list2;  
            list2 = list2.next;  
        }  
        cur = cur.next; 
    }  
      
    if (list1) {  
        cur.next = list1;  
    }  
    
    if (list2) {  
        cur.next = list2;  
    }  
  
    return dummy.next;  
};

结语

链表作为面试的必考题,解题思路和技巧需要烂熟于心。通过本文可以熟悉掌握链表题型的基本解题步骤,其中题目分别对应LeedCode203,136,83,21题,小伙伴们还需多加练习。

微信图片_20240522144724.jpg