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;
|
|||
|
}
|
|||
|
}
|
|||
|
```
|