题目描述

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

解题思路

  1. 遍历该链表,复制每一个节点,插入到当前节点的后面.形成如下链表. 1->1’->2->2’….
  2. 将每个拷贝节点的随机指针域,指向原节点(即拷贝节点的上一个节点)的随即指针域指向(注意随机指针域可能为空)的下一个节点.即1的随机指针域指向3,则1’的随机指针域指向3的下一个指针3’.
  3. 拆分链表,返回1’->2’->3’…

    代码实现

    1. /*
    2. public class RandomListNode {
    3. int label;
    4. RandomListNode next = null;
    5. RandomListNode random = null;
    6. RandomListNode(int label) {
    7. this.label = label;
    8. }
    9. }
    10. */
    11. public class Solution {
    12. public RandomListNode Clone(RandomListNode pHead)
    13. {
    14. if(pHead==null)return null;
    15. RandomListNode runner=pHead;
    16. RandomListNode copyCat=null;
    17. //First round: make copy of each nodes
    18. while(runner!=null){
    19. copyCat=new RandomListNode(runner.label);
    20. copyCat.next=runner.next;
    21. runner.next=copyCat;
    22. runner=copyCat.next;
    23. }
    24. //Second Round: assign random pointers for the copy nodes
    25. runner=pHead;
    26. while(runner!=null){
    27. copyCat=runner.next;
    28. //notice random pointers could be null
    29. copyCat.random=runner.random==null?null:runner.random.next;
    30. runner=runner.next.next;
    31. }
    32. //Third round: restore the original list, and extract the copy list.
    33. runner=pHead;
    34. pHead=runner.next;
    35. while(true){
    36. copyCat=runner.next;
    37. runner.next=copyCat.next;
    38. runner=copyCat.next;
    39. if(runner==null){
    40. break;
    41. }
    42. else{
    43. copyCat.next=runner.next;
    44. }
    45. }
    46. return pHead;
    47. }
    48. }