更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~
T:
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
这个题,看到一阵子,没搞懂什么意思,待看到函数名Clone,才恍然大悟过来,随即来了句return pHead; 提交之后发现错误,得知其后台是有内存地址判断机制的,不能把原来的一模一样的给照搬过去。
比较常规,效率也比较高的做法,就是在每个节点后面都再插入一个新的节点,该节点和其前驱节点一样,相当于复制节点,然后再将原节点的random指针复制到其对应的新节点。
具体可看一段代码:
code:
/*
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 oldNode = pHead;
// 设置next指针
while (oldNode != null) {
RandomListNode newNode = new RandomListNode(oldNode.label);
newNode.next = oldNode.next;
oldNode.next = newNode;
oldNode = oldNode.next.next;
}
oldNode = pHead;
// 设置random指针
while (oldNode != null) {
if (oldNode.random != null) {
oldNode.next.random = oldNode.random.next;
} else {
oldNode.next.random = null;
}
oldNode = oldNode.next.next;
}
RandomListNode tempNewNode = pHead.next;
// 使得新指针从原指针当中分离开来
while (tempNewNode.next != null) {
tempNewNode.next = tempNewNode.next.next;
tempNewNode = tempNewNode.next;
}
return pHead.next;
}
}
测试用例测试之后,也正确,但是提交之后总是error,一直摸不清错误在什么地方,后来仔细看了下别人提交的代码,才发现问题之所在。就是在clone时,原有的链表结构不能动,动了就不能通过,就是error。
所以才有以下修改之后的版本:
code:
package niuke.sward2offer.complicatedLinkClone;
class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
/**
* T: 复杂链表的复制
*
* 题目描述
* 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。
*
* date: 2015.11.15 9:31
* @author SSS
*
*/
public class Solution {
/**
*
* @param pHead
* @return
*/
public RandomListNode Clone(RandomListNode pHead) {
if (pHead == null) {
return null;
}
RandomListNode oldNode = pHead;
// 设置next指针
while (oldNode != null) {
RandomListNode newNode = new RandomListNode(oldNode.label);
newNode.next = oldNode.next;
oldNode.next = newNode;
oldNode = oldNode.next.next;
}
oldNode = pHead;
// 设置random指针
while (oldNode != null) {
if (oldNode.random != null) {
oldNode.next.random = oldNode.random.next;
} else {
oldNode.next.random = null;
}
oldNode = oldNode.next.next;
}
RandomListNode tempNewNode = new RandomListNode(0);
RandomListNode curNewNode = tempNewNode;
oldNode = pHead;
// 使得新指针从原指针当中分离开来
while (oldNode != null) {
tempNewNode.next = oldNode.next;
tempNewNode = oldNode.next;
oldNode.next = tempNewNode.next;
oldNode = oldNode.next;
}
return curNewNode.next;
}
public static void main(String []args) {
Solution solution = new Solution();
RandomListNode yiHead = new RandomListNode(1);
RandomListNode erNode = new RandomListNode(2);
RandomListNode sanNode = new RandomListNode(3);
RandomListNode siNode = new RandomListNode(4);
RandomListNode wuNode = new RandomListNode(5);
yiHead.next = erNode;
erNode.next = sanNode;
sanNode.next = siNode;
siNode.next = wuNode;
yiHead.random = sanNode;
erNode.random = wuNode;
sanNode.random = null;
siNode.random = erNode;
wuNode.random = null;
RandomListNode newNode = solution.Clone(yiHead);
RandomListNode temp1 = newNode;
while (temp1 != null) {
System.out.print(temp1.label + " ");
temp1 = temp1.next;
}
System.out.println();
temp1 = newNode;
while (temp1 != null) {
if (temp1.random == null) {
System.out.print("#" + " ");
} else {
System.out.print(temp1.random.label + " ");
}
temp1 = temp1.next;
}
}
}
更多2019年的技术文章,欢迎关注我的微信公众号:码不停蹄的小鼠松(微信号:busy_squirrel),也可扫下方二维码关注获取最新文章哦~