剑指Offer之二十六-复杂链表的复制

25 篇文章 0 订阅
21 篇文章 1 订阅

题目描述

  • 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
  • 复制一个复杂链表

结点定义

class RandomListNode {
	int label;
	RandomListNode next = null;
	RandomListNode random = null;
	
	public RandomListNode(int label){
		this.label = label;
	}
}

解析

  • 遍历链表,每个结点后边复制相同的结点,设置next指针
  • 复制结点的特殊指针。如果原始链表上的结点N的random指向S,则它对应的复制结点N的random指向S的下一个结点S
  • 抽取复制结点,连起来得到复制链表

代码实现

public RandomListNode clone(RandomListNode pHead){
	cloneNodes(pHead);
	connectRandomNodes(pHead);
    return reconnectNodes(pHead);
}

//复制原始链表的任意结点N并创建新结点N`,再把N`链接到N的后面
private void cloneNodes(RandomListNode pHead) {
	RandomListNode curNode = pHead;
	while(curNode != null){
		RandomListNode nextNode = curNode.next;
		RandomListNode copyNode = new RandomListNode(curNode.label);
		copyNode.next = nextNode;
		copyNode.random = null;
		
		curNode.next = copyNode;
		curNode = copyNode.next;
	}
	
}

//如果原始链表上的结点N的random指向S,则它对应的复制结点N`的random指向S的下一个结点S`
private void connectRandomNodes(RandomListNode pHead) {
	RandomListNode curNode = pHead;
	while(curNode != null){
		RandomListNode copyNode = curNode.next;
		if(curNode.random != null){
			copyNode.random = curNode.random.next;
		}
		curNode = copyNode.next;
	}
	
}

//组合复制的结点
private RandomListNode reconnectNodes(RandomListNode pHead) {
	
	RandomListNode curNode = pHead;
	RandomListNode copyHead = null;
	RandomListNode copyNode = null;
	
	//设置头结点
	if(curNode != null){
		copyHead = curNode.next;
		copyNode = curNode.next;
		curNode.next = copyNode.next;
		curNode = curNode.next;
		
	}
	
	while(curNode != null){
		 copyNode.next = curNode.next;
		 copyNode = copyNode.next;
		 curNode.next = copyNode.next;
		 curNode = curNode.next;
			
	}
	return copyHead;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛互联网

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值