前端程序员学好算法系列(四)链表

24. 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:

给定 1->2->3->4, 你应该返回 2->1->4->3.

解题:我们定义4个指针如上进行节点交换,
1.给head添加一个虚拟头节点thead
2.定义4个指针 p, node1, node2, next 我们需要将p.next ->node2  node1.next -> next    node2.next ->node1        完成以后将 p指针移动到node1
3.我们需要判断 p.next 和p.next.next 都不为空,这样next 最差为null 不会越界

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var swapPairs = function(head) {
    let thead = new ListNode(0);
    thead.next = head;
    let p = thead;
    while(p.next != null && p.next.next != null){
        let node1 = p.next;
        let node2 = node1.next;        let next = node2.next
p.next = node2;
        node1.next = next;
        node2.next = node1;
        p = node1;
    }
    return thead.next;
};

237. 删除链表中的节点
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。

现有一个链表 -- head = [4,5,1,9],它可以表示为:

示例 1:

输入: head = [4,5,1,9], node = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.

解题:

1.我们无法直接删除给定的节点,我们只能拿到给定节点的下一个节点的值,

2.我们用该节点的下一个节点的值覆盖当前节点的值,然后删除下一个节点,即相当于实现了对该节点的删除

3.我们处理node 为null和node.next为null的特殊情况

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} node
 * @return {void} Do not return anything, modify node in-place instead.
 */
var deleteNode = function(node) {
     if(node == null){
        return
     }
     if(node.next == null){
          delete node
          node = null
          return
     }
     node.val = node.next.val
     node.next = node.next.next
};

19. 删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。

示例:

给定一个链表: 1->2->3->4->5, 和 n = 2.

当删除了倒数第二个节点后,链表变为 1->2->3->5.

解题:
1.给head设置虚拟头节点
2.设置fast 和show两个指针
3.fast指针先移动n位,然后fast指针和show指针同时移动
4.当fast指针为空时,show.next节点即为需要删除的节点,我们把show.next ->show.next.next

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} n
 * @return {ListNode}
 */
var removeNthFromEnd = function(head, n) {
    let preHead = new ListNode(0)
    preHead.next = head
    let fast = preHead, slow = preHead
    // 快先走 n+1 步
    while(n--) {
        fast = fast.next
    }
    let i = 0
    // fast、slow 一起前进
    while(fast && fast.next) {
        slow = slow.next
        fast = fast.next

    }
    slow.next = slow.next.next
    return preHead.next
};

链表的js算法就先介绍到这里了

(0)

相关推荐

  • ​LeetCode刷题实战25:K 个一组翻转链表

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • leetcode刷题笔记-234. 回文链表(java实现)

    题目描述 请判断一个链表是否为回文链表. 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 来源:力扣(LeetCo ...

  • 前端程序员学好算法系列(九)递归回溯算法

    回溯算法主要应用于树形问题,我们先从一个简单的算法入手 17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 ...

  • 前端程序员学好算法系列(六)队列

    利用队列我们可以解决很多问题,js数组也可以实现队列,队列的思想为先近先出,js可以用 push和 shift() 很容易的实现一个队列 给你一个二叉树,请你返回其按 层序遍历 得到的节点值. (即逐 ...

  • 前端程序员学好算法系列(五)栈

    前端程序员学好算法系列(五)栈

  • 现在最赚钱的四个职业:程序员、算法工程师、家庭主妇和职业农民

    互联网时代最赚钱的四个职业:1.程序员!2.算法工程师!3.健康饮食家庭主妇!4.新型职业农民! 1:程序员是互联网时代基础设施的建设者,所以也被称为"码农",是最基础但也是最重要 ...

  • 程序员应知系列 - CPU执行原理

    任何计算机系统的真正复杂性都存在于处理器中,但是您知道它是如何工作的吗? 我是说它到底是怎么运作的?您编写的代码如何变成可以完成某些工作的东西? 当您知道CPU如何工作时,就知道不是魔术了 - 而是& ...

  • 程序员应知系列CPU执行原理(当处理器将地址放置在地址总线上时将选择一个特定的存储位置)

    (当处理器将地址放置在地址总线上时将选择一个特定的存储位置) https://m.toutiao.com/is/eyC48ar/ 任何计算机系统的真正复杂性都存在于处理器中,但是您知道它是如何工作的吗 ...

  • 如今前端程序员还有前途吗?

    目前,前端程序员仍然是IT行业比较火的技术之一,在现在或将来,只要我们在互联网上使用前端程序员,就一定是一个很有前途的行业.因此,对于现在的前端程序员是否有前途,对这个问题的回答是肯定的. 特别在当今 ...

  • 快速学习计算机知识|程序员|文章|算法|编程

    0 分享至 保持坚定的目标让我们学习路上不迷茫,跟随优秀的同行者让我们学习路上不孤单,学会利用优质的学习资源让我们的学习事半功倍. 给大家推荐几个非常优秀.硬核的公众号. yes的练级攻略 yes是「 ...

  • 微软程序员的算法学习之路

    一.写在前面 随着互联网的发展,各大厂的招聘要求水涨船高,几年前,做算法题还不是必备项,有的公司最多要求写个链表插入,二叉树遍历这种课本上的模板题. 但如今由于投身互联网的人太多,国内公司也向硅谷大厂 ...