复杂链表的复制

大概就是在每个原节点后复制一个新的节点,复制好之后再将链表拆为两个
代码如下:

struct ComplexListNode
{
	int val;
	ComplexListNode* next;
	ComplexListNode* random;
	ComplexListNode(int x):val(x),next(nullptr),random(nullptr){}

};
class solution
{
public:
	ComplexListNode* clone(ComplexListNode* head)
	{
		ComplexListNode* cur = head;
		ComplexListNode* newNode = nullptr;
		ComplexListNode* Next = nullptr;
		ComplexListNode* newNodeNext = nullptr;//下一次复制的节点
		ComplexListNode* newhead = nullptr;
	//复制原链表中的每一个节点
		while(cur!=nullptr)
		{
			newNode = new ComplexListNode(cur->val);
			newNode->next = cur->next;
			cur->next = newNode;//指向下一个节点
			cur = newNode->next;
		}
		cur = head;
		while(cur!=nullptr)
		{
			if(cur->random!=nullptr)
			{
				newNode = cur->next;
				newNode->random = cur->random->next;
			}
			cur - cur->next->next;
		}
		//将两个链表拆开
		cur = head;
		while(cur != nullptr)
		{
			newNode = cur->next;
			Next = cur->next->next;
			if(Next==nullptr)
			{
				newNodeNext= nullptr;
			}
			else
			{
				newNodeNext = Next->next;
			}
			cur->next = Next;
			newNode->next = newNodeNext;
			cur = Next;
		}
		return newNode;
	}
};

leetcode用到了回溯法+哈希表的方法

class Solution {
public:
    unordered_map<Node*,Node*> map;
    Node* copyRandomList(Node* head) {
        if(head==nullptr)
        {
            return nullptr;   
        }
        if(!map.count(head))
        {
            Node* newnode = new Node(head->val);
            map[head] = newnode;
            newnode->next = copyRandomList(head->next);
            newnode->random = copyRandomList(head->random);
        }
        return map[head];
        
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值