题目:
输入一个复杂链表(每个节点中有节点值,以及两个指针,
一个指向下一个节点,另一个特殊指针指向任意一个节点),
返回结果为复制后复杂链表的head。(注意,输出结果中
请不要返回参数中的节点引用,否则判题程序会直接返回空)
解题思路:
方法一:
直接通过原来链表来创建链表,包括随机指针。
方法二:
1.遍历链表,复制每个节点,并将复制的节点插入到原结点之后。
2.重新遍历链表,复制老结点的随机指针给新节点。
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 null;
}
//根据头结点结点创建新头结点
RandomListNode head=new RandomListNode(pHead.label);
RandomListNode clone=head;
if(pHead.random!=null)
{
//根据头结点创建新头节点的随机指针
head.random=new RandomListNode(pHead.random.label);
}
//通过循环创建结点
while(pHead.next!=null)
{
pHead=pHead.next;
//根据原来结点创建新节点
head.next=new RandomListNode(pHead.label);
if(pHead.random!=null)
{
//根据原结点的随机指针创建新节点的随机指针
head.next.random=new RandomListNode(pHead.random.label);
}
head=head.next;
}
return clone;
}
}
方法二代码实现:
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
/*
解题思路:
1.遍历链表,复制每个节点,并将复制的结点插入到原来结点后面。
2.重新遍历链表,复制老结点的随机指针给新节点。
3.拆分链表,将链表拆分为原链表和复制后的链表。
*/
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
if(pHead==null)
{
return null;
}
RandomListNode head=pHead;
//1.复制每个节点,并将新节点插入到原来结点的后面
while(head!=null)
{
//建立新节点
RandomListNode newNode=new RandomListNode(head.label);
//将新节点插入到原结点之后
head.next=newNode;
newNode.next=head.next;
head=newNode.next;
}
head=pHead;
//2.遍历链表,复制老结点的随机指针给新节点
while(head!=null)
{
RandomListNode nextNode=head.next;
if(head.random!=null)
{
//复制后的结点的随机指针指向老结点随机指针的下一个指针
nextNode.random=head.random.next;
}
head=head.next.next;
}
//3.拆分链表,将链表拆成原链表和复制后的链表
head=pHead;
RandomListNode p=pHead.next;
RandomListNode cur=p;
while(head!=null)
{
head.next=head.next.next;
if(cur.next!=null)
{
cur.next=cur.next.next;
}
cur=cur.next;
head=head.next;
}
return p;
}
}