现在有一个这样的链表:链表的每一个节点都附加了一个随机指针,随机指针可能指向链表中的任意一个节点或者指向空。
请对这个链表进行深拷贝。
RandomListNode *copyRandomList(RandomListNode *head) {
RandomListNode *copy,*p;
if (!head) return NULL;
for(p=head;p;p=p->next){
copy = new RandomListNode(p->label);
copy->next = p->next; // insert new at old next
p = p->next = copy;
}
for(p=head;p;p=copy->next){
copy = p->next; // copy random point
copy->random = (p->random?p->random->next:NULL);
}
for(p=head,head=copy=p->next;p;){
p = p->next = copy->next; // split list
copy = copy->next = (p?p->next:NULL);
}
return head;
}
/*
* 每个节点后都插入一个前面节点的拷贝,全部插入后再遍历,改变拷贝的next与random,形成新链表
* cur, nex
* for node = head : tail : 2
* cur = node
* copy = copyOf(cur)
* cur.next = copy//加入新节点,因此node步长为2
* end
* for node = head+1 : newTail : 1//next改变了指向,步长为1
* node.next = node.next.next;
* node.random = node.random.next;
* end
* return head.next;
*/
public RandomListNode copyRandomList(RandomListNode head) {
if(head == null || (head.next == null && head.random == null)){
return head;
}
RandomListNode node = head;
while(node != null){
RandomListNode copyNode = copyOf(node);
node.next = copyNode;
node = node.next.next;
}
node = head.next;
while(node != null){
if(node.next != null){
node.next = node.next.next;
}
if(node.random != null){
node.random = node.random.next;
}
node = node.next;
}
return head.next;
}
private RandomListNode copyOf(RandomListNode node) {
// TODO Auto-generated method stub
RandomListNode res = new RandomListNode(node.label);
res.next = node.next;
res.random = node.random;
return res;
}
RandomListNode *copyRandomList(RandomListNode *head) { //复制带random指针的链表
if(!head) return NULL;
//先将每一个节点复制一个新节点放在原节点后面 先不管random指针
RandomListNode *copy, *p;
for(p = head; p; p = p->next){
copy = new RandomListNode(p->label);
copy->next = p->next;
p = p->next = copy;
}
//为新节点的random指针赋值,若原节点random为NULL 不用管新节点(默认是NULL)
//若原节点random不为NULL,将新节点的random赋值为原节点random后面的那一个(因为
//后面这个是复制出来的)
for(p = head; p ; p = p->next){
if(p->random) p->next->random = p->random->next;
p = p->next;
}
//将新链表从混链表中中提取出来
copy = p = head->next;
while(p && p->next && p->next->next)
p = p->next = p->next->next;
return copy;
}
/**
* Definition for singly-linked list with a random pointer.
* class RandomListNode {
* int label;
* RandomListNode next, random;
* RandomListNode(int x) { this.label = x; }
* };
*/
public class Solution {
public RandomListNode copyRandomList(RandomListNode head) {
if (head == null) return null;
//第一遍扫描:对每个结点进行复制,把复制出来的新结点插在原结点之后
RandomListNode node = head;
while (node != null) {
RandomListNode newnode = new RandomListNode(node.label);
newnode.next = node.next;
node.next = newnode;
node = newnode.next;
}
//第二遍扫描:根据原结点的random,给新结点的random赋值
node = head;
while (node != null) {
if (node.random != null) node.next.random = node.random.next;
node = node.next.next;
}
RandomListNode newhead = head.next;
//第三遍扫描:把新结点从原链表中拆分出来
node = head;
while (node != null) {
RandomListNode newnode = node.next;
node.next = newnode.next;
if (newnode.next != null) newnode.next = newnode.next.next;
node = node.next;
}
return newhead;
}
}
先来个怕是要被打的解法:
RandomListNode *copyRandomList(RandomListNode *head) {
return head;
}
再来个正常解法:
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
if (head == NULL)
return head;
RandomListNode* cur = head;
while (cur != NULL){
RandomListNode* newNode = new RandomListNode(cur->label);
newNode->next = cur->next;
cur->next = newNode;
cur = newNode->next;
}
cur = head;
while (cur != NULL){
if (cur->random!=NULL)
cur->next->random = cur->random->next;
cur = cur->next->next;
}
RandomListNode *cpyHead = head->next;
cur = head;
RandomListNode*cpycur = cpyHead;
while (cur != NULL){
cur->next = cpycur->next;
if (cur->next!=NULL)
cpycur->next = cur->next->next;
cur = cur->next;
cpycur = cpycur->next;
}
return cpyHead;
}
};
public class Solution {
public RandomListNode copyRandomList(RandomListNode head) {
if(head==null){
return head;
}
RandomListNode newHead = new RandomListNode(head.label);
RandomListNode oldp = head.next;
RandomListNode newp=newHead;
Map<RandomListNode,RandomListNode> map = new HashMap<RandomListNode,RandomListNode>();
map.put(newp,head);
//对旧的链表进行复制
while(oldp!=null){
RandomListNode newtemp=new RandomListNode(oldp.label);
map.put(newtemp,oldp);
newp.next=newtemp;
newp=newp.next;
oldp=oldp.next;
}
//对旧链表的random指针进行复制
oldp=head;
newp=newHead;
while(newp!=null){
newp.random = map.get(newp).random;
newp=newp.next;
oldp=oldp.next;
}
return newHead;
}
}
RandomListNode* copyRandomList(RandomListNode* pHead)
{
RandomListNode* pNode = pHead;
if (pHead == NULL)
return NULL;
//1.首先实现random 除外的节点复制, 用map记录新旧节点映射关系
map<RandomListNode*, RandomListNode*> noMap;
noMap.insert(pair<RandomListNode*, RandomListNode*>(NULL, NULL));
RandomListNode* nHead = new RandomListNode(pNode->label);
noMap.insert(pair<RandomListNode*, RandomListNode*>(pHead, nHead));
RandomListNode* pNewNode = nHead;
while (pNode->next!= NULL)
{
pNewNode->next = new RandomListNode(pNode->next->label);
noMap.insert(pair<RandomListNode*, RandomListNode*>(pNode->next, pNewNode->next));
pNewNode = pNewNode->next;
pNode = pNode->next;
}
//2.调整random指针
pNewNode = nHead;
pNode = pHead;
while (pNewNode != NULL)
{
pNewNode->random = noMap.find(pNode->random)->second;
pNewNode = pNewNode->next;
pNode = pNode->next;
}
return nHead;
}
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
if(head == NULL)
return NULL;
RandomListNode* p = head;
while(p != NULL)
{
RandomListNode* tmp = p->next;
RandomListNode* newN = new RandomListNode(p->label);
p->next = newN;
newN->next = tmp;
p = tmp;
}
p = head;
while(p != NULL)
{
if(p->random != NULL)
p->next->random = p->random->next;
p = p->next->next;
}
p = head;
RandomListNode* res = head->next;
while(p->next != NULL)
{
RandomListNode* tmp = p->next;
p->next = p->next->next;
p = tmp;
}
return res;
}
};
public RandomListNode copyRandomList(RandomListNode head) {
return head;
}
这样都能过。。。。哈哈
/**
* Definition for singly-linked list with a random pointer.
* struct RandomListNode {
* int label;
* RandomListNode *next, *random;
* RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
* };
*/
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
if (head == NULL) return NULL;
RandomListNode *p = head, *q = NULL;
while (p) {
RandomListNode *node = new RandomListNode(p->label);
node->next = p->next;
p->next = node;
p = node->next;
}
p = head;
while (p) {
q = p->next;
q->random = p->random == NULL ? NULL : p->random->next;
p = p->next->next;
}
p = head->next;
while (p) {
p->next = p->next == NULL ? NULL : p->next->next;
p = p->next;
}
return head->next;
}
}; class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
RandomListNode *cur=new RandomListNode(0);
RandomListNode *p=head;
RandomListNode *t=cur;
while(p)
{
RandomListNode *tmp=p;
t->next=new RandomListNode(tmp->label);
t->next->random=tmp->random;
t=t->next;
p=p->next;
}
return cur->next;
}
}; import java.util.*;
public class Solution {
public RandomListNode copyRandomList(RandomListNode head) {
Map<RandomListNode, RandomListNode> m = new HashMap<>();
RandomListNode root1 = head, root2 = null;
while(root1 != null) {
RandomListNode copy = new RandomListNode(root1.label);
if(root2 != null) root2.next = copy;
root2 = copy;
m.put(root1, root2);
root1 = root1.next;
}
root1 = head;
while(root1 != null) {
if(root1.random != null) {
root2 = m.get(root1) ;
root2.random = m.get(root1.random);
}
root1 = root1.next;
}
return m.get(head);
}
} public class Solution {
public RandomListNode copyRandomList(RandomListNode head) {
/**
* 首先复制原链表,复制的节点在原链表节点之后,得到 1->1`->2->2`->3->3`...
* 然后复制随机指针,新链表的随机指针是原链表的下一个节点(例如 1->3 复制为 1`->3`)
* 将链表拆分为两个链表, 一共遍历三遍,时间复杂度O(n)
*/
if(head==null){
return null;
}
// 复制链表
RandomListNode p = head;
while(p!=null){
RandomListNode node = new RandomListNode(p.label);
node.next = p.next;
p.next = node;
p = node.next;
}
// 复制随机指针
p = head;
RandomListNode q = head.next;
while(p!=null){
if(p.random!=null){
q.random = p.random.next;
}
p = q.next;
if(p!=null) q = p.next;
}
// 拆分两个链表
p = head;
q = head.next;
RandomListNode nHead = head.next;
while(p!=null){
p.next = q.next;
p = q.next;
if(p!=null) {
q.next = p.next;
q = p.next;
};
}
return nHead;
}
} class Solution {
public:
unordered_map<RandomListNode*,RandomListNode*> map;
RandomListNode *copyRandomList(RandomListNode *head) {
if(head==NULL)
return NULL;
if(map.find(head)==map.end()){
RandomListNode* p=new RandomListNode(head->label);
map[head]=p;
p->next=copyRandomList(head->next);
p->random=copyRandomList(head->random);
}
return map[head];
}
};
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
RandomListNode *copy,*p;
if(head == NULL)
return NULL;
for(p=head; p; p=p->next)
{
copy = new RandomListNode(p->label);
copy->next = p->next;
p->next = copy;
p = p->next;
}
for(p=head; p; p=copy->next)
{
copy = p->next;
copy->random = (p->random?p->random:NULL);
}
for(p=head,head=copy=p->next; p; )
{
p = p->next = copy->next;
copy = copy->next = p?p->next:NULL;
}
return head;
}
}; //纯递归
import java.util.ArrayList;
public class Solution {
public RandomListNode copyRandomList(RandomListNode head) {
if(head==null) return null;
RandomListNode h = new RandomListNode(head.label);
f(head,h);
return h;
}
public ArrayList<RandomListNode[]> f(RandomListNode p ,RandomListNode q ){
if(p==null) return null;
if(p.next==null)
q.next=null;
else
q.next=new RandomListNode(p.next.label);
q.random = p.random;
ArrayList<RandomListNode[]> arr = f(p.next,q.next);
if(arr!=null){
if(p.random==null) return arr;
boolean flag = true;
for(int i=0;i<arr.size();i++){
if(arr.get(i)[0]==p){
arr.get(i)[1].random=q;
arr.remove(i);
flag=false;
break;
}
}
if(flag)
arr.add(new RandomListNode[]{p.random,q});
if(arr.size()==0) return null;
else return arr;
}
if(p.random==null) return null;
ArrayList<RandomListNode[]> list = new ArrayList<RandomListNode[]>();
list.add(new RandomListNode[]{p.random,q});
return list;
}
}