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

本文介绍了一种复制复杂链表的方法。复杂链表中的每个节点包含一个指向下一个节点的next指针和一个指向链表中任意节点的sibling指针。文章通过三个步骤实现了链表的复制:首先复制节点并插入到原节点之后;然后设置复制节点的sibling指针;最后将链表拆分为原始链表和复制链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:请实现函数ComplexListNode clone(ComplexListNode head),复制一个复杂链表。在复杂链表中,每个结点除了有一个next 域指向下一个结点外,还有一个sibling 指向链表中的任意结点或者null。
题目解析:

这里写图片描述
如图结构。
第一步,根据原始链表的每一个结点N创建对应的N’,我们把N’接在N的后面。处理后如图
这里写图片描述
第二步,假如B指向E,那么B’指向E’。
如图,
这里写图片描述
第三步,将这个长链表,、分拆成两个链表,奇数结点链接起来就是原链表,偶数链接起来就是复制的链表。

//复杂链表的复制
    public static class ComplexListNode {
        int value;
        ComplexListNode next;
        ComplexListNode sibling;
    }

    //复制结点
    public static void cloneNodes(ComplexListNode head) {
        while (head != null) {
            ComplexListNode temp = new ComplexListNode();
            temp.value = head.value;
            // 复制结点的next指向下一个要被复制的结点
            temp.next = head.next;
            // 被复制结点的next指向复制结点
            head.next = temp;
            // heed指向下一个被复制结点的位置
            head = temp.next;
        }
    }

    //设置sibling的链接
    public static void setSibling(ComplexListNode head) {
        while (head != null) {
            head.next.sibling = head.sibling.next;
            head = head.next.next;
        }
    }

    //拆分链表,得到原链表和复制链表
    public static ComplexListNode getCopyList(ComplexListNode head) {
        if (head == null) {
            return null;
        }
        ComplexListNode copyHead = head.next;//复制链表的头结点
        // 用于记录当前处理的复制结点
        ComplexListNode pointer = copyHead;
        head = head.next.next;
        while (head != null) {
            pointer.next = head;
            pointer = pointer.next;
            head=head.next.next;
        }
        return copyHead;
    }
    public static ComplexListNode clone(ComplexListNode head) {
        // 如果链表为空就直接返回空
        if (head == null) {
            return null;
        }

        // 先复制结点
        cloneNodes(head);
        // 再链接sibling字段
        setSibling(head);
        // 将整个链表拆分,返回复制链表的头结点
        return getCopyList(head);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值