输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
该题的解题思路
分三步
- 首先遍历链表,复制每一个结点,将复制的结点插入到原链表结点的后面,即复制结点a’插入到原链表a结点后面
- 画图可知,a’.random = a.random.next;根据这个关系,遍历链表,将随机指针random指对。
- 遍历链表,将链表一分为二,奇数部分是原链表,偶数部分是复制链表,之后将复制链表的头结点返回。
这里是代码片段
public class Solution {
public RandomListNode Clone(RandomListNode pHead){
RandomListNode pNode = null,pCloneHead = null,pClone = null;
pNode = pHead;
//当输入的结点是空的时候,要考虑此种情况
if(pHead == null){
return null;
}
//这是第一步,复制结点并插入到被复制结点的后面
while(pNode != null){
pClone = new RandomListNode(pNode.label);
pClone.next = pNode.next;
pClone.random = null;
pNode.next = pClone;
pNode = pClone.next;
}
//这是第二步,根据a'.random = a.random.next关系遍历链表
pNode = pHead;
pClone = pNode.next;
while(pNode != null){
if(pNode.random != null){
pClone.random = pNode.random.next;
}
pNode = pClone.next;
if(pNode != null) //注意此处,要不会陷入死循环
pClone = pNode.next;
}
//第三部分,拆分链表
pNode = pHead;
pClone = pNode.next;
pCloneHead = pClone;
while(pNode != null){
pNode.next = pClone.next;
pNode = pClone.next;
if(pNode != null){ //这也是,不写会进入死循环
pClone.next = pNode.next;
pClone = pNode.next;
}
}
pClone.next = null;
return pCloneHead;
}
}
第一次写博客,写的这道题希望对人们有帮助。。