【LeetCode】链表面试题---138. 复制带随机指针的链表

  给定一个链表, 每个节点包含一个额外增加的随机指针random, 该指针可以指向链表中的任何节点或空节点, 要求返回这个链表的深拷贝

typedef struct ListNode
{
    int val;
    struct ListNode*next;
    struct ListNode*random;
} ListNode;

    我们要返回一个原来链表的深度拷贝,那么我们就要拷贝它的next ,和random,我们的思路是,在每一个老节点的后面增加一个新节点,这个节点的信息和老节点的信息一样,最后拷贝成功后再新老链表分开,如下图 : 

 

思路就是这样,我们来看看具体实现,我在这里用的是C语言.

ListNode* copyRandomList(ListNode* head) {
	if (head = NULL)
	{
		return NULL;
	}
	//复制新节点
	ListNode *cur = head;
	while (cur != NULL)
	{
		//申请一个节点,进行初始化
		ListNode *newnode = (ListNode *)malloc(sizeof(ListNode));
		newnode->val = cur->val;
		newnode->random = NULL;
		//将新节点与老节点进行连接
		newnode->next = cur->next;
		cur->next = newnode;
		//老节点往后移动,继续拷贝下一个
		cur = newnode->next;
	}
	//复制random
	cur = head;
	while (cur != NULL)
	{
		if (cur->random != NULL)
		{
			//最重要的一步,复制random
			cur->next->random = cur->random->next;
		}
		cur = cur->next->next;
	}
	//拆开
	cur = head;
	//定义一个新头节点,一会就返回这个节点
	ListNode *newhead = head->next;
	while (cur != NULL)
	{
		ListNode *newnode = cur->next;
		cur->next = newnode->next;
		if (newnode->next != NULL)
		{
			newnode->next = newnode->next->next;
		}

		cur = cur->next;
	}
	//返回新链表的头节点
	return newhead;
}

    这道题难想的还是在于random信息的复制, 整体代码实现并不算很难.

     感谢观看,有什么问题可以指出,谢谢!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值