复制带随机指针的链表

题目

给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。
返回一个深拷贝的链表。

解题思路

第一遍扫的时候巧妙运用next指针, 开始数组是1->2->3->4 。 然后扫描过程中 先建立copy节点 1->1'->2->2'->3->3'->4->4', 然后第二遍copy的时候去建立边的copy, 拆分节点, 一边扫描一边拆成两个链表,这里用到两个dummy node。第一个链表变回1->2->3 , 然后第二变成 1'->2'->3' 。

代码实现

/**
 * Definition for singly-linked list with a random pointer.
 * class RandomListNode {
 *     int label;
 *     RandomListNode next, random;
 *     RandomListNode(int x) { this.label = x; }
 * };
 */
public class Solution {
    /**
     * @param head: The head of linked list with a random pointer.
     * @return: A new head of a deep copy of the list.
     */
//复 制 next节点 
//1->2->3->4 ,变成 1->1'->2->2'->3->3'->4->4'
  private void copyNext(RandomListNode head) {
            while (head != null) {
                RandomListNode newNode = new RandomListNode(head.label);
                newNode.next = head.next;
                newNode.random = head.random;
                head.next = newNode;
                head = head.next.next;
            }
        }
        //复制 random
        //如果1的随机指针指向2,则复制1'的随机指针指向2',
  private void copyRandom(RandomListNode head) {
            while (head != null) {
                if (head.next.random != null) {
                    head.next.random = head.random.next;
                } 
                head = head.next.next;
            }
        }
        //拆 分
        // 1->1'->2->2'->3->3'->4->4' 变成 1->2->3->4和1'->2'->3'->4'
  private RandomListNode spiltList(RandomListNode head) {
            RandomListNode newHead = head.next;
            while (head != null) {
                RandomListNode temp = head.next;
                head.next = temp.next;
                head = head.next;
                if (temp.next != null) {
                    temp.next = temp.next.next;
                }
            }
            return newHead;
        } 
  public RandomListNode copyRandomList(RandomListNode head) {
        if (head == null) {
            return null;
        }
        copyNext(head);
        copyRandom(head);
        return spiltList(head);
    }     
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。返回一个深拷贝的链表。 解法一...
    杰米阅读 4,476评论 0 0
  • 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点。返回一个深拷贝的链表。2017...
    goodAndBad阅读 2,286评论 0 0
  • //leetcode中还有花样链表题,这里几个例子,冰山一角 求单链表中结点的个数----时间复杂度O(n)这是最...
    暗黑破坏球嘿哈阅读 5,426评论 0 6
  • 作为一个资深的新手程序员😂,链表这些既基础又深奥的东西是日常工作中并不常见,但是却非常重要,所以就总结一下链表的简...
    Clark_new阅读 9,770评论 4 12
  • 我是骆驼 盼望雨的囚者 一梦这海的反覆 星辉停驻 光影迎合 水浪般温柔的 那在黑夜中的我 独步深醒 沙漠里 我就是...
    大海里的骆驼阅读 1,521评论 0 0