数据结构与算法-链表三

285 阅读1分钟

文章简要概述

  • 本文主要是进行链表相关的算法题刷题题解记录,带你进一步了解链表相关算法如何解。
  • 将接着上一篇文章数据结构与算法--链表二的内容;
  • 这篇文章主要介绍leetcode中分隔链表复制带随机指针的链表的解题思路。

与链表相关算法

分隔链表

分隔链表--leetcode

题目大意:

  给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。

  你应当 保留 两个分区中每个节点的初始相对位置。
  

partition.jpeg

  输入: head = [1,4,3,2,5,2], x = 3
  输出:[1,2,2,4,3,5]

解题思路:

  • 根据X的值将链表分隔成两部分,一组小于X的,其他值放入另一组。
  • 即得到small和large两个链表,在将small和large进行链接。即可得到结果。

代码:

  function partition (head, x) {
      let small = new ListNode(-1, head);
      let large = new ListNode(-1, head);
      const smallHead = small;
      const largeHead = large;
      while(head !== null) {
          if (head.val < x) {
              small.next = head;
              small = small.next;
          } else {
              large.next = head;
              large = large.next;
          }
          head = head.next;
      }
      large.next = null;
      small.next = largeHead.next;
      return smallHead.next;
  };

复制带随机指针的链表

复制带随机指针的链表--leetcode

题目大意: 题目原文比较长且难以理解,大致意思是给定一个链表,复制出一份一模一样的链表。但这个链表是有两个指针的,next和random。

e1.png

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

解题思路:

  • 将原链表中的每个节点复制一份放在原节点的next指针后
  • 将原链表中每个复制节点的random指针指向到原节点random指向的next节点上
  • 将原链表与复制的链表解开,返回新复制的链表。
  • 大致思路入下图。

2.png

3.png

4.png

代码:

   function copyRandomList (head) {
        if (!head) return head;
        for(let node = head; node; node = node.next) {
            const copyNode = new Node(node.val, node.next, null);
            node.next = copyNode;
            node = node.next;
        }
        for (let node = head; node; node = node.next) {
            const copyNode = node.next;
            copyNode.random = node.random !== null ? node.random.next : null;
            node = node.next;
        }
        const res = head.next;
        for (let node = head; node; node = node.next) {
            const copyNode = node.next;
            node.next = node.next.next;
            copyNode.next = copyNode.next !== null ? copyNode.next.next : null;
        }
        return res;
   };

结束语

数据结构与算法相关的练习题会持续输出,一起来学习,当前是链表部分,链表相关算法一共是三遍。下一篇开始队列类型的算法。后期还会有其他类型的数据结构,题目来源于leetcode。

往期文章:

数据结构与算法-链表一

数据结构与算法-链表二

如果文章对你有帮助,欢迎点赞,关注!

文中图片资源来源于leetcode