剑指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--028-字符串的排列

参考 字符串全排列问题 字符串的全排列和组合算法 链接 牛客OJ:字符串的排列 九度OJ:http://ac.jobdu.com/problem.php?pid=13...
  • gatieme
  • gatieme
  • 2016年04月26日 15:56
  • 1318

二叉排序树转换成排序的双向链表

题目描述:将二叉排序树转换成一个排序的双向链表,要求:不能创建任何新的节点,只能通过调整指针的指向来实现; 解题思路:我们知道二叉排序树的递归定义是: 若它的左子树不空,则左子树上...

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

剑指offer 面试题26 复杂链表 题目: 请实现函数 ComplexListNode clone(ComplexListNode head), 复制一个复杂链表。在复杂链表中,每个...

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

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

【剑指Offer面试编程题】题目1524:复杂链表的复制--九度OJ

这道题目主要还是题目的意思有点混淆不清吧,所谓的输出“第二个代表当前节点的特殊指针的值”,很有可能理解成当前节点的指针值,也就是元素的编号。但实际是指针所指的元素的值。题目当然肯定是很简单的,只需要利...

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

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

剑指Offer:面试题26——复制复杂的链表(java实现)

问题描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。 思路1: 1.先复制链表节点,并用next链接起来。 2.然后对每...

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

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

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

题目:给定一个复杂链表,对其进行复制产生一个新的复杂链表。复杂链表中每个节点中有三个部分:数据域,指向链表中下一个节点的指针,指向链表中其他任意一个节点的指针。复杂链表中节点的定义如下: struct...

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

复制一个复杂链表。在复杂链表中,每个节点有next 指针指向下一个结点外,还有pSibling指向链表任何结点或者NULL。   根据作者思路实现这个需求,代码没有作者简洁。 #include ...
  • huruzun
  • huruzun
  • 2014年03月27日 15:30
  • 867
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:剑指Offer-复杂链表的复制
举报原因:
原因补充:

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