美文网首页
Leetcode系列之链表(3)

Leetcode系列之链表(3)

作者: FisherTige_f2ef | 来源:发表于2019-10-16 09:55 被阅读0次

题目3:

现在有一个这样的链表:链表的每一个节点都附加了一个随机指针,随机指针可能指向链表中的任意一个节点或者指向空。

请对这个链表进行深拷贝

思路:

1.链表的复制的一般方法(插入复制,断裂复原),具体如下

插入断裂法复制链表

ABCD是原来的链表,abcd是复制的链表,第一遍扫描顺序复制next指针,把ABCD的next分别指向abcd,将a的next指针指向B,b的next指针指向C,依次类推

复制random指针: a->random=A->random,依此类推

恢复:A->next=a->next;a->next=a->next->next,依此类推

代码:

/**

* Definition for singly-linked list with a random pointer.

* class RandomListNode {

*    int label;

*    RandomListNode next, random;

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

* };

*/

import java.util.*;

public class Solution {

    public RandomListNode copyRandomList(RandomListNode head) {

        if(head==null){

                return null;

        }

        RandomListNode p1=head;

        while(p1!=null){

              RandomListNode p2=new RandomListNode(0);

                p2.label=p1.label;

                p2.random=null;

                p2.next=p1.next;

                p1.next=p2;

                p1=p2.next;

        }//将新节点穿插入旧链表中

        p1=head;//p1为新链表的头结点

        while(p1!=null){

            RandomListNode p2=p1.next;//p2为下一节点

            if(p1.random!=null)//p1的随机结点为null时,p1的next结点找不到,但p2应该为空

              p2.random=p1.random.next;

              p1=p2.next;

        }//随机值拷贝完成

        p1=head;

        RandomListNode newHead=head.next;

        while(p1!=null){

            RandomListNode p2=p1.next;

            p1.next=p2.next;

            if(p2.next!=null){

                p2.next=p2.next.next;

            }

            p1=p1.next;

      }//将链表拆开,返回新拷贝的链表

    return newHead;

    }   

}

相关文章

  • Leetcode系列之链表(3)

    题目3: 现在有一个这样的链表:链表的每一个节点都附加了一个随机指针,随机指针可能指向链表中的任意一个节点或者指向...

  • Swap Nodes in Pairs

    标签: C++ 算法 LeetCode 链表 每日算法——leetcode系列 问题 Swap Nodes in ...

  • Remove Nth Node From End of List

    标签: C++ 算法 LeetCode 链表 每日算法——leetcode系列 问题 Remove Nth Nod...

  • Merge k Sorted Lists

    标签: C++ 算法 LeetCode 链表 每日算法——leetcode系列 问题 Merge Two Sort...

  • 关于链表经典算法题都在这里了

    1.单链表反转(LeetCode 206) 2.链表中环的检测 (LeetCode 141) 3.求链表中环开始结...

  • Leetcode系列之链表(16)

    题目: 有两个大小分别为m和n的有序数组A和B。请找出这两个数组的中位数。你需要给出时间复杂度在O(log (m+...

  • Leetcode系列之链表(14)

    题目: 给定一个链表,删除链表的倒数第n个节点并返回链表的头指针 例如, 给出的链表为:1->2->3->4->5...

  • Leetcode系列之链表(15)

    题目: 给定两个代表非负数的链表,数字在链表中是反向存储的(链表头结点处的数字是个位数,第二个结点上的数字是百位数...

  • Leetcode系列之链表(13)

    题目: 合并k个已排序的链表并将其作为一个已排序的链表返回。分析并描述其复杂度。 思路: 典型的多路归并问题 代码...

  • Leetcode系列之链表(9)

    题目: 将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的 思路: 普通的排序问题,难...

网友评论

      本文标题:Leetcode系列之链表(3)

      本文链接:https://www.haomeiwen.com/subject/irrymctx.html