题目的链接在这里:https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba
- 题目大意
- 一、示意图
- 二、解题思路
- 迭代加拼接拆分
题目大意 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。 下图是一个含有5个结点的复杂链表。图中实线箭头表示next指针,虚线箭头表示random指针。为简单起见,指向null的指针没有画出。
一、示意图 二、解题思路
迭代加拼接拆分迭代加拼接拆分
代码如下:
public class Solution {
public RandomListNode Clone(RandomListNode pHead) {
//复杂节点 一个指向next 一个指向随机的一个
if(pHead==null)
return null;
RandomListNode randomListNode=pHead;
while (randomListNode!=null){
//值和当前值一样
RandomListNode tempNode=new RandomListNode(randomListNode.label);
//然后把他指向当前的next
tempNode.next=randomListNode.next;
//然后让当前的 指向rand
randomListNode.next=tempNode;
//然后当这个当前值 移动到原链表的下一个
randomListNode=tempNode.next;
}
randomListNode=pHead;
while (randomListNode!=null){
//先判断他这个指向不是null
if(randomListNode.random!=null){
//那就更新新的节点 也就是当前节点的next
//把他赋值成 原链表中random节点指向的节点
randomListNode.next.random=randomListNode.random.next;
}
//然后让他继续指向下一个原链表节点
randomListNode=randomListNode.next.next;
}
randomListNode=pHead.next;
RandomListNode oldNode=pHead;
RandomListNode result=pHead.next;
while (randomListNode.next!=null){
//原链表进行组合
oldNode.next=oldNode.next.next;
//新的也进行组合
randomListNode.next=randomListNode.next.next;
//然后都往后移
oldNode=oldNode.next;
randomListNode=randomListNode.next;
}
//这里就会出现 randomlistNode指向最后一个 这个时候 old也指向最后一个
oldNode.next=null;
//然后返回新链表的头指针
return result;
}
}


![java 剑指offer之[数据结构 困难]JZ25 复杂链表的复制 java 剑指offer之[数据结构 困难]JZ25 复杂链表的复制](http://www.mshxw.com/aiimages/31/307211.png)
