题目描述

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

https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba

解题想法

比较有技巧,放一张图就知道怎么做了

复杂链表的复制 - 图1

分为 3 步:

  1. 插入复制节点

  2. 复制 random 指向

  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){
  15. return pHead;
  16. }
  17. // 1. 对每个节点进行复制,链接到原节点后面
  18. RandomListNode head1 = pHead;
  19. while (head1 != null){
  20. RandomListNode temp = new RandomListNode(head1.label);
  21. temp.next = head1.next;
  22. head1.next = temp;
  23. head1 = temp.next;
  24. }
  25. // 2. 复制random指针,
  26. RandomListNode head2 = pHead;
  27. while (head2 != null){
  28. RandomListNode temp = head2.random;
  29. if (temp != null){
  30. head2.next.random = temp.next;
  31. }else{
  32. head2.next.random = null;
  33. }
  34. head2 = head2.next.next;
  35. }
  36. // 3. 将复制的节点进行拆分出来
  37. RandomListNode head3 = pHead;
  38. RandomListNode head4 = pHead.next;
  39. while (head3 != null){
  40. RandomListNode temp = head3.next;
  41. head3.next = temp.next;
  42. if (temp.next != null){
  43. temp.next = temp.next.next;
  44. }else{
  45. temp.next = null;
  46. }
  47. head3 = head3.next;
  48. }
  49. return head4;
  50. }
  51. }