哈喽,今天我又来来分享一道链表题啦
来自力扣的第138. 复制带随机指针的链表
这道题目乍一看是复制链表的题,那就很简单了,但是此链表中的节点结构与往常的链表的节点结构不同,多了一个random随机指针的指向,因此会多一个需要处理的环节
首先假设如图链表(节点值没有设置为数字,设置为字母是方便辨认,数字容易混淆)
节点A:值为A,下一个节点为B节点,随机指针指向:节点C
节点B:值为B,下一个节点为C,随机指针指向:null
节点C:值为C,下一个节点为null,随机指针指向:节点B
大概阐述一下我的思路:
第一步:将每个节点进行复制,并将当前节点进行节点值与节点的next进行复制,将链表串起来,最后形成以下链表(copyA 等于 A 为了区别 前缀加copy区别节点 )
第二步:将复制出来的节点的random指针进行复制
第三步:将复制的节点与原来节点间的指针断开,让复制的节点的next指向的是复制出来的节点,最后得到的就是复制带随机指针的链表
代码如下:
var copyRandomList = function(head) {
if (head === null) {
return null;
}
//第一步:进行节点的复制,并将random进行初始化为null
let node1 = head
while(node1){
let nodeNew = new Node(node1.val,node1.next,null)
node1.next = nodeNew
node1 = node1.next.next
}
//第二步:将当前的random复制给复制出来的节点的random
let node2 = head
while(node2){
let nodeNew = node2.next // nodeNew 即是复制出来的节点
// 这里的node2.random.next 就是指向当前存在的随机指针的下一个指向,
//即 A节点的随机指针指向的是C节点,那拿的就是 C节点的下一个节点,copyC节点
nodeNew.random = (node2.random !== null) ? node2.random.next : null
node2 = node2.next.next // 当前复制出来的节点完成后 绕过这两个刚刚进行操作的节点
}
//第三步:进行复制节点之间的指针链接,断开原先节点的指针
const headNew = head.next; // 这里直接就绕过了第一个被复制的节点
let node3 = head
while(node3){
let nodeNew = node3.next // 这里为第一个复制的节点
node3.next = node3.next.next // 这里改变当前复制的节点前指向下一个复制的节点
//如果复制的节点的下一个节点不是null的话 说明肯定还有一个下一个节点复制出来的节点
nodeNew.next = nodeNew.next !== null ? nodeNew.next.next : null
node3 = node3.next//将节点切换到下一个被复制出来的节点继续进行玄幻
}
return headNew;
};
最终如下图的执行过程
分享就到这里~