题目
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
思路
代码
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
if(pHead == null)
return null;
RandomListNode cur = pHead;
//在原链表上复制链表
while(cur != null){
RandomListNode cloneNode = new RandomListNode(cur.label);
RandomListNode nextNode = cur.next;//保存当前节点的下一个节点
cur.next = cloneNode;
cloneNode.next = nextNode;
cur = nextNode;
}
//遍历链表 复制原节点的随机指针给新链表
cur = pHead;
while(cur != null){
//后面那个cur.random.next next不能忘 因为是指向克隆的那个 所以是有next
cur.next.random = cur.random == null? null:cur.random.next;
cur = cur.next.next;
}
//分离原链表与复制链表
cur = pHead;
RandomListNode pcloneHead = pHead.next;
while(cur != null){
RandomListNode cloneNode = cur.next;
cur.next = cloneNode.next;
cloneNode.next = cur.next == null ? null:cur.next.next;
cur = cur.next;//通过上上步已经移动了一格 所以next就够了
}
return pcloneHead;
}
}
反思
注意特判
改变链表之间的映射关系 时一定要保存下一节点的信息
防止断链