博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
有随机指针的链表复制
阅读量:6613 次
发布时间:2019-06-24

本文共 2346 字,大约阅读时间需要 7 分钟。

hot3.png

原题

  A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

  Return a deep copy of the list.

题目大意

  一个单链表包含一个指向任意结点或者null的结点指针,返回这个链表的深拷贝

解题思路

  第一步:复制结点,复制的结点放在待复制的结点后,依然组成一个单链表

  第二步:串接随机指针
  第三步:链表拆分。拆成原链和复制链

代码实现

结点类

class RandomListNode {    int label;    RandomListNode next, random;    RandomListNode(int x) { this.label = x; }};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

实现类

public class Solution {    public RandomListNode copyRandomList(RandomListNode head) {        if (head == null) {            return null;        }        copyNode(head);        linkRandomPointer(head);        return splitList(head);    }    /**     * 复制结点,复制的结点放在待复制的结点后,依然组成一个单链表     *     * @param head 链表头     */    public void copyNode(RandomListNode head) {        // 记录当前要被复制的缜        RandomListNode node = head;        while (node != null) {            // 复制一个新的结点            RandomListNode copyNode = new RandomListNode(node.label);            // 将结点串接到被复制的结点后,并且依然组成单链表            copyNode.next = node.next;            node.next = copyNode;            node = copyNode.next;        }    }    /**     * 串接随机指针     *     * @param head 链表头     */    public void linkRandomPointer(RandomListNode head) {        // 记录当前要被复制的缜        RandomListNode node = head;        while (node != null) {            // 随机指针有指向某个具体的结点            if (node.random != null) {                // 串接node被复制结点的随机指针                node.next.random = node.random.next;            }            // 指向下一个被复制的结点            node = node.next.next;        }    }    /**     * 将链表拆分,还原原来的链表,并且组装拷贝的链表     *     * @param head 链表头     * @return 拷贝的新链表头     */    public RandomListNode splitList(RandomListNode head) {        // 新链表头        RandomListNode copyHead = head.next;        // 当前处理的被复制的结点        RandomListNode node = head;        // 当前复制的结点        RandomListNode copy;        while (node != null){            // 指向复制结点            copy = node.next;            // node.next指向下一个被复制的结点            node.next = copy.next;            // 下一个被复制的结点不为null            if (node.next != null) {                // copy.next指向下一个复制的结点                copy.next = node.next.next;            }            // node指向下一个要被处理的被复制结点            node = node.next;        }        return copyHead;    }}

转载于:https://my.oschina.net/u/2822116/blog/810603

你可能感兴趣的文章
2019程序媛面试之美少女战士
查看>>
黑马程序员——内部类
查看>>
校园的早晨
查看>>
单例模式的5种实现方式,以及在多线程环境下5种创建单例模式的效率
查看>>
oracle取前几行|中间几行|后几行
查看>>
16.1 Tomcat介绍
查看>>
QuickBI助你成为分析师——数据源FAQ小结
查看>>
十周三次课
查看>>
S/4HANA服务订单Service Order的批量创建
查看>>
2008 AD 复制有防火墙要开什么端口
查看>>
IT服务管理中的知识库建设
查看>>
【Lucene】Lucene通过CustomScoreQuery实现自定义评分
查看>>
我的友情链接
查看>>
Android应用程序组件Content Provider的共享数据更新通知机制分析(3)
查看>>
敏友的【敏捷个人】有感(11): 敏捷个人线下活动有感
查看>>
刺激用户危机意识,实现快速盈利的营销思维
查看>>
英特尔嵌入式突围
查看>>
WIN FORM 多线程更新UI(界面控件)
查看>>
JDBC公共动作类
查看>>
JUnit单元测试
查看>>