解题思路:
- 输入一个复杂链表(每个节点中有节点值,
- 以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),
- 返回结果为复制后复杂链表的head。
- (注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
- 个人理解。这道题就是原链表A->B->C->D 复制后 A->A1->b->B1->C->C1->D->D1
- 输出原链表 A->B->C->D 新链表 A1->B1->C1->D1
- 第一步:根据原链表创建与每个结点值相同的结点放在原节点后面。如A->A1。
- 第二步:设置复制出来的结点的random。(把N’的random指向N的random)。
- 第三步:把这个长链表拆分成两个链表:把奇数位置的结点用Next链接起来就是原始链表,偶数数值的则是复制链表。
/**
* 输入一个复杂链表(每个节点中有节点值,
* 以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),
* 返回结果为复制后复杂链表的head。
* (注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
* 个人理解。这道题就是原链表A->B->C->D 复制后 A->A1->b->B1->C->C1->D->D1
* 输出原链表 A->B->C->D 新链表 A1->B1->C1->D1
* 第一步:根据原链表创建与每个结点值相同的结点放在原节点后面。如A->A1。
* 第二步:设置复制出来的结点的random。(把N'的random指向N的random)。
* 第三步:把这个长链表拆分成两个链表:把奇数位置的结点用Next链接起来就是原始链表,偶数数值的则是复制链表。
*/
public class Test5{
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 node=pHead;
while(node!=null){
RandomListNode next=node.next; //保存node的下一个结点
RandomListNode clone =new RandomListNode(node.label);//通过构造使结点复制node结点
node.next=clone;//复制后的结点插入node的后面
clone.next=next;//将node的下个结点插入复制结点后方。
node=next;//node变为下一个结点开始循环,实现A->A1->b->B1->C->C1->D->D1。
}
//复制random特殊结点,原理与node相同
node=pHead;
while (node!=null){
if(node.random!=null){
node.next.random=node.random.next;//复制后结点的random结点指向原结点的特殊结点的下一个结点,完成复制
}
node=node.next.next;//node移动两个。因为是复制过的
}
//输出复制后的结点
node = pHead;
RandomListNode newHead = pHead.next;//第二结点是复制后链表的头结点
while (node != null) {
RandomListNode cunnode = node.next;
node.next = cunnode.next;
if (cunnode.next != null) {
cunnode.next = cunnode.next.next;
}
node = node.next;
}
return newHead;
}
}
}