复杂的链表
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
我的思考:
什么是深拷贝?
浅拷贝:拷贝对象的地址,修改后会影响原对象的属性;深拷贝则不影响原属性值
对于这个题目,意思就是不能通过改变指针来实现,需要创建节点
遍历链表,获取节点值创建新节点
随机指针怎么处理?
代码及思路
public RandomListNode Clone(RandomListNode pHead) {
//深拷贝主要是将另一个对象的属性值拷贝过来之后,另一个对象的属性值并不受到影响,因为此时它自己在堆中开辟了自己的内存区域
if(pHead == null) return null;
RandomListNode head = pHead;
//插入复制的节点
while(head!=null){
//复制新节点
RandomListNode temp = new RandomListNode(head.label);
//新节点指向下一个节点
temp.next = head.next;
//被复制的节点指向新节点
head.next = temp;
//指针移动至下一个节点
head = temp.next;
}
head = pHead;
//给随机指针赋值
while(head!=null){
//复制的节点的随机指针 -> 被复制节点随机指针所指向节点的下一个
RandomListNode rand = head.random;
if(rand!=null){
head.next.random = rand.next;
}
head = head.next.next;
}
//拆分
head = pHead;
RandomListNode res_head = pHead.next; //从第二个节点开始
while(head!=null){
//提取复制的节点
RandomListNode temp = head.next;
temp.next =
head = head.next.next;
temp = temp.next;
head = head.next;
}
head.next= null;
return res_head;
}