题目
具体题目信息可以参考上一篇文章。
进阶:不使用额外的数据结构,只用有限几个变量,且在时间复杂度为O(N)内完成原问题要实现的函数。
思路
进阶解法不使用哈希表来保存对应关系,而只采用有限的几个变量完成所有功能。具体过程如下:
1.遍历链表,对每个节点生成相应的副本节点,并将副本节点放入原链表中。
原链表 | 步骤1之后 |
1->2->3->null | 1->1'->2->2'->3->3'->null |
2.再次遍历链表,设置每个副本节点的rand指针
3.对链表进行拆分。
4.将副本链表中的头节点返回即可。
源码
public class Node{
public int value;
public Node next;
public Node rand;
public Node(int data){
this.value=data;
}
}
public Node copyListWithRand2(Node head){
if(head==null){
return null;
}
Node cur=head;
Node next=null;
//复制并连接每一个节点
while(cur!=null){
next=cur.next;
cur.next=new Node(cur.value);
cur.next.next=next;
cur=next;
}
cur=head;
Node curCopy=null;
//设置复制节点的rand指针
while(cur!=null){
next=cur.next.next;
curCopy=cur.next;
//这里之所以是cur.rand.next是因为指向对应的复制的节点,而不是原节点
curCopy.rand=cur.rand!=null?cur.rand.next:null;
cur=next;
}
Node res=head.next;
cur=head;
//拆分
while(cur!=null){
next=cur.next.next;
curCopy=cur.next;
cur.next=next;
curCopy.next=next!=null?next.next:null;
cur=next;
}
return res;
}