题目
请实现一个函数可以复制一个复杂链表。
在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。
注意:
函数结束后原链表要与输入时保持一致。

解法:模拟

首先,在每个结点后面复制一份同样的结点
然后遍历整张链表的奇数位置(原始)结点,如果有random,那么复制,即 p->next->random = p->random->next
最后,将整张链表按奇数位置和偶数位置分开成两张链表
时间复杂度O(n),空间复杂度O(1)

  1. /**
  2. * Definition for singly-linked list with a random pointer.
  3. * struct ListNode {
  4. * int val;
  5. * ListNode *next, *random;
  6. * ListNode(int x) : val(x), next(NULL), random(NULL) {}
  7. * };
  8. */
  9. class Solution {
  10. public:
  11. ListNode *copyRandomList(ListNode *head) {
  12. for (auto p = head; p;) {
  13. auto copy = new ListNode(p->val);
  14. auto next = p->next;
  15. p->next = copy;
  16. copy->next = next;
  17. p = next;
  18. }
  19. for (auto p = head; p; p = p->next->next) {
  20. if (p->random) {
  21. p->next->random = p->random->next;
  22. }
  23. }
  24. auto dummy = new ListNode(-1);
  25. auto cur = dummy;
  26. for (auto p = head; p; p = p->next) {
  27. cur->next = p->next;
  28. cur = cur->next;
  29. p->next = p->next->next;
  30. }
  31. return dummy->next;
  32. }
  33. };