1.问题描述
指的是一个链表除了有next引用之外,还存在一个引用随机指向一个链表的结点。
2.问题分析:
第一步:为了能够更好地把原链表的随机指针复制过去,应该把链表复制为以下样子:
1 -->1–>2–>2–>3–>3–>4–>4
第二步:复制原链表的随机值 。
第三步:把列表恢复为两个链表,并且返回复制之后链表得头结点。
class Solution {
public Node copyRandomList(Node head) {
if(head==null)
{
return null;
}
Node p1=head;
while(p1!=null)
{
Node p2=new Node(p1.val);
p2.next=p1.next;
p1.next=p2;
p1=p2.next;
} //第一步
p1=head;
while(p1!=null)
{
Node p2=p1.next;
if(p1.random!=null)
{
p2.random=p1.random.next; // 这一步很关键,这样子就通过原链表把原链表的随机指针复制给新链表
}
p1=p2.next;
} // 第二步
p1=head;
Node newHead=head.next;
while(p1!=null)
{
Node p2=p1.next;
p1.next=p2.next;
if(p2!=null)
{
if(p2.next!=null)
{
p2.next=p2.next.next;
}
}
p1=p1.next;
}
return newHead; //第三步
}
}