剑指 Offer 35. 复杂链表的复制

Posted Billy Miracle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 35. 复杂链表的复制相关的知识,希望对你有一定的参考价值。

题目描述:

思路:

因为是复制链表,而且random指向的节点是随机的,所以我们不能直接按顺序复制,而是可以采取递归。那么如何判断我们这个节点有没有被创建呢?我们可以利用哈希表一一对应的特性,利用哈希表来实现。下面就浅介绍一下哈希表:
建立:

unordered_map<int,int> map; //<string,string>,<char,char>,...

添加元素:

map.insert(pair<int,int>(1, 10));
map.insert(pair<int,int>(2, 20));
map[3] = 30;
map[4] = 40;

成员函数:

map.begin() //指向哈希表的第一个容器
map.end()  //指向哈希表的最后一个容器,实则超出了哈希表的范围,为空

map.find(2)  //查找key为2的键值对是否存在 ,若没找到则返回m.end()
if (map.find(2) != map.end()) //判断找到了key为2的键值对

map.count(3)  //返回 1
map.count(5)   //返回0

map.size()   //返回哈希表的大小

map.empty()  //判断哈希表是否为空,返回值为true/false

map.clear()  //清空哈希表

unordered_map<int,int> map1;
unordered_map<int,int> map2;
map1.swap(map2);
swap(map1,map2);

遍历:

unordered_map<int, int> count;
for (auto p : count) 
	int front = p.first;   //key
    int end = p.second;   //value


unordered_map<int, int> count;
for(auto it = m.begin(); it != m.end(); it++) 
    int front = it->first;   //key
    int end = it->second;   //value

菜鸡的代码:

/*
// Definition for a Node.
class Node 
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) 
        val = _val;
        next = NULL;
        random = NULL;
    
;
*/
class Solution 
private: 
    unordered_map<Node*, Node*> map;
public:
    Node* copyRandomList(Node* head) 
        if (head == NULL) 
            return head;
        
        if (!map.count(head)) 
            Node *newHead = new Node(head->val);
            map.insert(pair<Node*, Node*>(head, newHead));
            newHead->next = copyRandomList(head->next);
            newHead->random = copyRandomList(head->random);
        
        return map[head];
    
;

思路2:

通过答案的提示,菜鸡发现竟然还可以通过在链表节点后插入复制的节点这种方式来对应,这样操作真的十分巧妙,让小菜鸡佩服不已。
这样一波操作下来只需要遍历三次链表就可以完成了。

  1. 复制
  2. 链接random
  3. 链接next并恢复原链

hhh,第一次没恢复原链,告诉我不行😂😂😂

菜鸡代码2:

class Solution 
public:
    Node* copyRandomList(Node* head) 
        for (Node *p = head; p; p = p->next->next) 
            Node *newNode = new Node(p->val);
            newNode->next = p->next;
            p->next = newNode;
        
        for (Node *p = head; p; p = p->next->next) 
            p->next->random = p->random ? p->random->next : NULL;
        
        Node *newHead = head ? head->next : head;
        for (Node *p = head; p; p = p->next) 
            Node *temp = p->next->next;
            if (temp) 
                p->next->next = temp->next;
            
            p->next = temp;
        
        return newHead;
    
;

以上是关于剑指 Offer 35. 复杂链表的复制的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 35. 复杂链表的复制

剑指 Offer 35. 复杂链表的复制

剑指 Offer 35. 复杂链表的复制

剑指offer--35复杂链表的复制

剑指offer--35复杂链表的复制

Java 剑指offer(35) 复杂链表的复制