• 剑指offer-复杂链表的复制


    题目描述:

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

    思路:

    第一步:根据原始链表的每个节点N创建对应的N’,把N’链接到N的后面。

    第二步:设置复制出来的结点的random结点,假设原始链表上的N的random指向结点S,那么其对应复制出来的N’是N的next指向的结点,同样S’也是S的next指向的结点

    第三步:把这个长链表拆分成两个链表,偶数位置的结点链接起来就是复制出来的链表。

    public class Test {
    
        public static void main(String[] args) {
            Test t = new Test();
            ComplexListNode list1 = t.new ComplexListNode(1);
            ComplexListNode list2 = t.new ComplexListNode(2);
            ComplexListNode list3 = t.new ComplexListNode(3);
            ComplexListNode list4 = t.new ComplexListNode(4);
            ComplexListNode list5 = t.new ComplexListNode(5);
    
            list1.next = list2;
            list1.random = list3;
            list2.next = list3;
            list2.random = list5;
            list3.next = list4;
            list4.next = list5;
    
            ComplexListNode l = t.cloneList(list1);
            while (l != null) {
                System.out.print(l.value + " ");
                l = l.next;
            }
    
        }
    
        class ComplexListNode {
            int value;
            ComplexListNode next;
            ComplexListNode random;
    
            public ComplexListNode(int value) {
                this.value = value;
            }
        }
    
        public ComplexListNode cloneList(ComplexListNode head) {
            if (head == null)
                return null;
            // 第一步:根据原始结点N创建新结点N‘,N’链接到N后面
            // A-B-C-D-E
            // A-A'-B-B'-C-C'-D-D'-E-E'
            ComplexListNode node = head;
            while (node != null) {
                ComplexListNode cloneNode = new ComplexListNode(0);
                cloneNode.value = node.value;
                cloneNode.next = node.next;
                node.next = cloneNode;
                node = cloneNode.next;
            }
    
            // 第二步:设置复制出来的random.
            ComplexListNode node1 = head;
            while (node1 != null) {
                ComplexListNode cloneNode1 = node1.next;
                if (node1.random != null) {
                    cloneNode1.random = node1.random.next;
                }
                node1 = cloneNode1.next;
            }
    
            // 第三步:把长链表拆成两个链表,偶数位置 的为复制链表
            ComplexListNode nodeEven = null;
            ComplexListNode nodeEvenHead = null;
            ComplexListNode node2 = head;
            if (node2 != null) {
                nodeEven = nodeEvenHead = node2.next;
                node2.next = nodeEven.next;
                node2 = node2.next;
            }
            while (node2 != null) {
                nodeEven.next = node2.next;
                nodeEven = nodeEven.next;
                node2.next = nodeEven.next;
                node2 = node2.next;
            }
            return nodeEvenHead;
        }
    
    }
  • 相关阅读:
    Windows 代码实现关机(直接黑屏)
    Windows SEH学习 x86
    Smali 语法文档
    SIOCADDRT: No such process
    Windbg 常用命令整理
    ida GDB 远程调试
    IDA 使用技巧
    Windows X64 Patch Guard
    C 和C++ 名称修饰规则
    【转载】 硬盘主引导记录(MBR)及其结构详解
  • 原文地址:https://www.cnblogs.com/zywu/p/5778792.html
Copyright © 2020-2023  润新知