题目
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
牛客网给定以下链表类。
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
分析
思路:
分析题目,其给出的链表除了next结点外还有一个random结点,其随机指向某一个结点,故称为复杂链表。所以要复制这个复杂链表,我们需要分三步走。
1)首先只复制结点的label值并将该复制后的结点接在原结点后一个,而复制的结点的next指向原结点的next结点。
2)复制原结点的random结点。
3)拆分链表,即偶数部分的结点连接起来即是复制后的链表。
代码:
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
//判断链表头结点是否为空
if(pHead==null) return null;
//复制链表
RandomListNode cur = pHead;
while(cur!=null) {
RandomListNode clo = new RandomListNode(cur.label);
RandomListNode next = cur.next;
cur.next = clo;
clo.next = next;
cur = next;
}
//复制随机结点
cur = pHead;
while(cur!=null) {
cur.next.random = cur.random==null?null:cur.random.next;
cur = cur.next.next;
}
//拆分复制后的链表,正好是偶数部分
cur = pHead;
RandomListNode pCloHead = pHead.next;
while(cur!=null){
RandomListNode clo = cur.next;
cur.next = clo.next;
clo.next = clo.next==null?null:clo.next.next;
cur = cur.next;
}
return pCloHead;
}
}