剑指Offer-复杂链表的复制

原创 2017年06月20日 13:08:07

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

题目解析

这个题目主要的难点在于随机指向的这个节点如何去复制到另一个链表中去,那么,这里如果单纯的采用直接赋值拷贝的方式肯定是不可取的,因为这个方式的话需要遍历整个链表确定每个元素指向了第几个元素然后再次扫描并进行修改指向,这当然肯定不是最好的解决办法。

解题思路

既然要复制,那么平行的将每个元素复制一份作为一个拷贝,作为其原来元素的next插入到原来的链表中去,这样的话就形成了,A->A`->B->B`的链表,那么,在复制的过程中我们可以同时拷贝A的random来记录其random指向,注意random可以在后面做向后移动一个元素的方式进行获取。

所以这个题分两个步骤,

1.复制所有元素并将其添加为原来元素的next节点,同时复制random指向。

2.删除链表中原来的节点,将新的节点取出来,并且,链表中的random和next全部向后面平移一位。

代码实现

/*
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 node = pHead;
        while(node != null) {
            
            RandomListNode nodeCopy = new RandomListNode(node.label);
            nodeCopy.next = node.next;
            nodeCopy.random = node.random;
            node.next = nodeCopy;
            
            node = node.next.next;
        }
        
        node = pHead;
        int count = 0;
        RandomListNode head = null;
        RandomListNode temp = null;
        
        while(node != null) {
            
            if(count % 2 == 1) {
                
                if(count == 1) {
                    head = node;
                }
                if(node.random != null) {
                    node.random = node.random.next;
                }
                temp = node.next;
                if(node.next != null) {
                    node.next = node.next.next;
                    
                }
                node = temp; 
                
            } else {
                node = node.next;
            }
            
            count ++;
            
        }
        pHead.next = null;
            
        return head;
    }
}




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

剑指Offer:复杂链表的复制

# -*- coding:utf-8 -*- #class RandomListNode: # def __init__(self, x): # self.label = x #...

【剑指offer】面试题35:复杂链表的复制

题目输入一个复杂链表(每个节点中有节点值,以及两个指针, 一个指向下一个节点,另一个特殊指针指向任意一个节点或者null), 返回结果为复制后复杂链表的head。 (注意,输出结果中请不要返回参...

《剑指offer》复杂链表的复制

一、题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,...

剑指offer-复杂链表的复制

/* public class RandomListNode {     int label;     RandomListNode next = null;     RandomListNode r...

剑指offer 面试题26复杂链表的复制

复制一个复杂链表。在复杂链表中,每个节点有next 指针指向下一个结点外,还有pSibling指向链表任何结点或者NULL。   根据作者思路实现这个需求,代码没有作者简洁。 #include ...

剑指offer面试题26:复杂链表的复制

题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。struct ComplexListNode{ int m_nV...

剑指offer(14)-复杂链表的复制

题目: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否...

剑指offer面试题26之复杂链表的复制

1,题目: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。求一个复制体。 2,考虑点: (1),链表为空的情况。 (2),链表只有一个结点...

剑指offer面试题26-复杂链表的复制

题目: 请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。 在复杂链表中,每一个节点除了一个m_pNext指针指向下一个节点外,...

剑指offer-面试题26-复杂链表的复制

题目描述:请实现函数ComplexListNode clone(ComplexListNode head),复制一个复杂链表。在复杂链表中,每个结点除了有一个next 域指向下一个结点外,还有一个si...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)