题目:
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的 深拷贝。
思路: 先复制链表,再将链表连接到一起(p2跟在p1后面),然后处理Random指向,让p2的Random指向 指向p1的Random指向的下一个
//链表的深拷贝
/*public class CNode {
int val;
CNode next = null;
CNode random = null;
CNode(int val) {
this.val = val;
}
}*/
public class Solution {
public CNode testComplexListCopy(CNode head) {
if (head == null) {
return null;
}
CNode p1 = head;
while (p1 != null) {//复制链表
CNode p2 = new CNode(p1.val);
/*=CNode p2=new CNode();
p2.val=p1.val;
p2.random=null;
*/
p2.next = p1.next;//将p2插到p1后面
p1.next = p2;
p1 = p2.next;//p1得往后走
}//此时p2已经完全插到p1后面
//处理Random指向
p1 = head;
while (p1 != null) {
CNode p2 = p1.next;
if (p1.random != null) {
p2.random = p1.random.next;
}
p1 = p2.next;
}
//将两个链表分开,p2中的Random指向没有改变,因为在第二步中Random的指向指的就是p2中的结点
p1 = head;
CNode newHead = head.next;
while (p1 != null) {
CNode p2 = p1.next;
p1.next = p2.next;
if (p2.next != null) {
p2.next = p2.next.next;
}
p1 = p1.next;
}
return newHead;
}
}
//链表的浅拷贝
Node copy(Node head){
Node cur=head;
Node result=null;
Node last=null;//新链表的最后一个结点
while(cur!=null){
Node node=new Node();//当原链表不为空时,遍历原链表尾插到新链表中
node.val=cur.val;
if(result==null){
result=node;
}else{
last.next=node;
}
last=node;
cur=cur.next;
}
}
return result;
}