题目
题号:25
题目名:复杂链表的复制
编程语言
Java
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
初次思路
暂时理解这个题目的意思是一条链表,上面的结点会有一个next指针,还有一个random指针,这个random指针是连在链表上的一个随机一个结点的,这个是重点.
一下就能想到的就是暴力法
按逻辑来写,先完全复制next的指针做一个链表.之后重要的就是重现random指针
random指针怎么找?那我就在新老链表同时放一个指针,两个链表都有next指针了,从头开始,向后遍历结点,如果老链表指针找到了这个结点对应的random结点,那么新指针肯定也移动到了新链表同样位置的结点,那我拿新链表指向找到的这个random结点肯定是没错的
解题代码
public class Solution {
public RandomListNode Clone(RandomListNode pHead) {
/**
* 暴力法
* 首先将链表clone
* 然后在找random
* 找到每个random下标,逐一去指
*/
if (pHead == null) return null;
RandomListNode newNode = new RandomListNode(0);//虚拟头结点
RandomListNode curr = newNode;//新链表遍历指针
RandomListNode oldCurr = pHead;//设置旧链表遍历
//复制next的链表
while (oldCurr != null) {
curr.next = new RandomListNode(oldCurr.label);//连向新创建结点
curr = curr.next;
oldCurr = oldCurr.next;
}
RandomListNode newCurr = newNode.next;//设置新链表遍历指针
RandomListNode copy = pHead;//设置copy的指针
while (copy!=null) {
//这两个指针同步后移,为了找到random结点
RandomListNode currPHead = pHead;
RandomListNode currNewNode = newNode.next;//新节点的遍历结点
//复制random的指向
while (currPHead != copy.random) {
//找到pHead的random的位置
currPHead = currPHead.next;
currNewNode = currNewNode.next;
}
//找到了后赋值
newCurr.random = currNewNode;
newCurr=newCurr.next;
copy = copy.next;
}
return newNode.next;
}
}
算法练习代码我都开源在码云上,有需要的朋友可以看看