剑指offer每日一题算法题(java解法)
方便日后复习,从今天开始。
算法之行始于足下
[编程题]复杂链表的复制-- Java实现
------------------------------------------------------------------------------------------------------
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
解题思路:
1.遍历链表,复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面
2.重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.random.next;
3.拆分链表,将链表拆分为原链表和复制后的链表
/*
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 currentNode=pHead;
//1、复制每个结点,如复制结点A得到A1,将结点A1插到结点A后面;
while(currentNode!=null){
//创建一个克隆节点
RandomListNode cloneNode = new RandomListNode(currentNode.label);
RandomListNode nextNode=currentNode.next;// 标记A的下一个节点为A的下一个
currentNode.next=cloneNode; //把克隆的节点给头的下一个
cloneNode.next=nextNode; //把A的下一个节点给克隆的下一个,就完成了克隆节点的加入
currentNode=nextNode; //把当前节点给到克隆的下一个,重新循环加入克隆节点
}
currentNode=pHead; //完成了图的第一步
//2、重新遍历链表,复制老结点的随机指针给新结点,如A1.random = A.random.next;
while(currentNode!=null){
//如果随机指针不为空,则也复制给克隆节点random
currentNode.next.random=currentNode.random==null?null:currentNode.random.next;
//再把节点往后移给B.c.d.d...
currentNode = currentNode.next.next;
}
//3、拆分链表,将链表拆分为原链表和复制后的链表
currentNode = pHead;
//创建克隆链表的头节点
RandomListNode pCloneHead = pHead.next;
//3、拆分链表,将链表拆分为原链表和复制后的链表,把复杂链表里的非克隆节点剥离出来
while(currentNode!=null){
RandomListNode cloneNode=currentNode.next;
currentNode.next=cloneNode.next; //a->b
cloneNode.next =cloneNode.next==null?null:cloneNode.next.next;//如果b的下一个的下一个不为空,则给b的下一个
currentNode = currentNode.next;//节点赋值到下一个
}
return pCloneHead;
}
}