题目描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。 下图是一个含有5个结点的复杂链表。图中实线箭头表示next指针,虚线箭头表示random指针。为简单起见,指向null的指针没有画出。
示例:
输入:{1,2,3,4,5,3,5,#,2,#}
输出:{1,2,3,4,5,3,5,#,2,#}
解析:我们将链表分为两段,前半部分{1,2,3,4,5}为ListNode,后半部分{3,5,#,2,#}是随机指针域表示。
以上示例前半部分可以表示链表为的ListNode:1->2->3->4->5
后半部分,3,5,#,2,#分别的表示为
1的位置指向3,2的位置指向5,3的位置指向null,4的位置指向2,5的位置指向null
如下图:
解法:
思路:
1、针对链表中的每一节点,逐一复制,并添加到前一节点之后。
2、将新节点的的random指针指向前一节点的next指针。
3、拆分链表
代码:
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
public class Solution {
public RandomListNode Clone(RandomListNode pHead) {
//处理空的情况
if(pHead == null){
return pHead;
}
RandomListNode cur = pHead;
//复制节点
while(cur != null){
int val = cur.label;
RandomListNode randomListNode = new RandomListNode(val);
randomListNode.next = cur.next;
cur.next = randomListNode;
cur = randomListNode.next;
}
cur = pHead;
//遍历链表,给新节点添加random指向
while(cur != null){
if(cur.random != null){
cur.next.random = cur.random.next;
}
cur = cur.next.next;
}
//拆分链表
RandomListNode newHead = pHead.next;
cur = pHead;
while(cur.next != null){
RandomListNode temp = cur.next;
cur.next = temp.next;
cur = temp;
}
return newHead;
}
}