您的位置:首页 > Web前端

剑指Offer—25—复杂链表的复制

2017-08-23 21:11 411 查看
复杂链表的复制 : 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的 head 。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

package A25复杂链表的复制;

public class Solution {
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;

RandomListNode(int label) {
this.label = label;
}
}

public RandomListNode Clone(RandomListNode pHead){
// 思路:在源节点后面添加复制节点
if (pHead == null) {
return null;
}

// 每个链表后面复制个点加上  1——2——3  →  1——1'——2——2'——3——3'
RandomListNode rNode = pHead;
while(rNode != null){
RandomListNode tNode = new RandomListNode(rNode.label);
tNode.next = rNode.next;
rNode.next = tNode;
rNode = tNode.next;
}

// 每个原始点的random指向的节点,和复制的节点下一个相同
RandomListNode rNode2 = pHead;
while(rNode2 != null){
if (rNode2.random != null) {
rNode2.next.random = rNode2.random.next;
}
rNode2 = rNode2.next.next;
}

// 分割链表
RandomListNode pNode = pHead.next;
RandomListNode tempNode = null;
RandomListNode curNode = pHead;
while(curNode.next != null){
tempNode = curNode.next;
curNode.next = tempNode.next;
curNode = tempNode;
}
return pNode;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  链表