文章简要概述
- 本文主要是进行链表相关的算法题刷题题解记录,带你进一步了解链表相关算法如何解。
- 将接着上一篇文章数据结构与算法--链表二的内容;
- 这篇文章主要介绍leetcode中
分隔链表
和复制带随机指针的链表
的解题思路。
与链表相关算法
分隔链表
题目大意:
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
输入: 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;
};
复制带随机指针的链表
题目大意: 题目原文比较长且难以理解,大致意思是给定一个链表,复制出一份一模一样的链表。但这个链表是有两个指针的,next和random。
输入: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节点上
- 将原链表与复制的链表解开,返回新复制的链表。
- 大致思路入下图。
代码:
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。