64 lines
1.7 KiB
Markdown
64 lines
1.7 KiB
Markdown
---
|
||
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;
|
||
}
|
||
}
|
||
``` |