复杂链表的复制

原创 2017年10月06日 19:52:45

题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的头结点。
思路:
1. 首先根据链表的next遍历一遍,在每个node节点的后面复制一个与node的label相等的节点,如图所示;
2. 再遍历新链表,为复制的节点指定random指针(黄色箭头所示);
3. 将新链表拆分=原链表+复制后的链表
4. 在操作过程中一定要主要判断节点是否为空
5. 时间复杂度o(n),空间复杂度o(n)
这里写图片描述
示例代码如下:

/**
 * Copyright (C), 2017
 * FileName: Main
 * Author:   Mengjun Li
 * Date:     2017/10/3 上午11:09
 * Description:
 */

/**
 * @author Mengjun Li
 * @create 2017/10/3
 * @since 1.0.0
 */

public class Main {
    public static void main(String args[]) {
        //定义测试节点
        RandomListNode node1 = new RandomListNode(1);
        RandomListNode node2 = new RandomListNode(2);
        RandomListNode node3 = new RandomListNode(3);
        RandomListNode node4 = new RandomListNode(4);
        RandomListNode node5 = new RandomListNode(5);
        RandomListNode node6 = new RandomListNode(6);
        node1.next = node2;
        node1.random = node3;

        node2.next = node3;
        node2.random = node4;

        node3.next = node4;
        node3.random = node1;

        node4.next = node5;
        node4.random = node2;

        node5.next = node6;
        node5.random = null;

        node6.random = node5;

        System.out.println("原链表的next指针");
        while (head != null) {
            System.out.print(head.label + "-->");
            head = head.next;
        }
        System.out.println("null");

        //Clone链表
        head = Clone(node1);

        System.out.println("clone的链表的next指针");
        while (head != null) {
            System.out.print(head.label + "-->");
            head = head.next;
        }
        System.out.println("null");

        System.out.println("原链表的random指针");
        head = node1;
        while (head != null) {
            if (head.random != null)
                System.out.print(head.label + "-->"+head.random.label+", ");
            else
                System.out.print(head.label + "--> null, ");
            head = head.next;
        }
        System.out.println("");

        head = Clone(node1);
        System.out.println("clone的链表的random指针");
        while (head != null) {
            if (head.random != null)
                System.out.print(head.label + "-->"+head.random.label+", ");
            else
                System.out.print(head.label + "--> null, ");
            head = head.next;
        }

    }

    public static RandomListNode Clone(RandomListNode pHead) {
        if (pHead == null)
            return pHead;
        RandomListNode tmp = null, oHead = pHead, newNode;
        //第一步:在原链表中每一个节点的后面复制前面一个节点
        while (oHead != null) {
            newNode = new RandomListNode(oHead.label);
            tmp = oHead.next;
            oHead.next = newNode;
            newNode.next = tmp;
            oHead = tmp;
        }
        oHead = pHead;
        //第二步:给复制的节点的random指针赋值
        while (oHead != null) {
            if (oHead.random != null)//random可能为null
                oHead.next.random = oHead.random.next;
            else
                oHead.next.random = null;
            oHead = oHead.next.next;
        }
        //将复制后的链表和原链表断开
        oHead = pHead;
        newNode = pHead.next;
        while (oHead != null) {
            tmp = oHead.next;
            if (tmp != null)
                oHead.next = tmp.next;
            oHead = tmp;
        }
        return newNode;
    }

}

class RandomListNode {
    int label;
    RandomListNode next = null;
    RandomListNode random = null;

    RandomListNode(int label) {
        this.label = label;
    }
}

输出如下:

原链表的next指针
1-->2-->3-->4-->5-->6-->null
clone的链表的next指针
1-->2-->3-->4-->5-->6-->null
原链表的random指针
1-->32-->43-->14-->25--> null, 6-->5, 
clone的链表的random指针
1-->32-->43-->14-->25--> null, 6-->5
版权声明:本文为博主原创文章,未经博主允许不得转载。

剑指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.然后对每...

LintCode(M) 复制带随机指针的复杂链表

复制带随机指针的链表描述 笔记 数据 评测 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。返回一个深拷贝的链表。 您在真实的面试中是否遇到过这个题?...

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

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

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

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

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

复制一个复杂链表。在复杂链表中,每个节点有next 指针指向下一个结点外,还有pSibling指向链表任何结点或者NULL。   根据作者思路实现这个需求,代码没有作者简洁。 #include ...
  • huruzun
  • huruzun
  • 2014年03月27日 15:30
  • 868

牛客网刷题之复杂链表的复制

题目描述:解题思路:过程分为三步: 首先,遍历链表,复制当前结点currentNode对应的结点cloneCurNode,并将cloneCurNode放置在currentNode的后面,这样就形成一...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:复杂链表的复制
举报原因:
原因补充:

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