technology-note/算法/leetcode/常规题/Q1744.复制带随机指针的链表.md
2022-03-03 23:31:48 +08:00

64 lines
1.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: "202203031"
date: "2022/03/03 20:38:05"
title: "leetcode.Q1744.复制带随机指针的链表"
tags: ["java", "leetcode", "链表"]
categories:
- "算法"
- "leetcode刷题"
---
## 解析思路
leetcode 中等,题目描述[点击这里](https://leetcode-cn.com/problems/copy-list-with-random-pointer/)。
比较简单链表结构可以通过遍历复制关键是random节点如何处理这里提供一个处理思路
<!-- more -->
通过两次遍历来实现:
- 第一次遍历建立新的链表不处理random遍历的同时将旧链表节点和新链表节点做一个一一对应
- 第二次遍历处理random节点根据map找到新链表的位置
## 代码
```java
public class Q138 {
private static class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
public Node copyRandomList(Node head) {
//老节点和新节点的对应关系
Map<Node, Node> oldNewMap = new HashMap<>();
//建立虚拟头节点便于处理
Node res = new Node(0), tempNew = res, tempOld = head;
while (tempOld != null) {
tempNew.next = new Node(tempOld.val);
tempNew = tempNew.next;
//旧节点和新节点一一对应
oldNewMap.put(tempOld, tempNew);
tempOld = tempOld.next;
}
//再次便利将random关系处理好
while (head != null) {
if (head.random != null) {
oldNewMap.get(head).random = oldNewMap.get(head.random);
}
head = head.next;
}
return res.next;
}
}
```