Наткнулся на это . Надеюсь, это поможет!
Ссылаясь на одно решение по этой ссылке, ниже.
1) Создайте копию 1 и вставьте ее между 1 и 2, создайте копию 2 и вставьте между 2 и 3. Продолжайте таким же образом, добавьте копию N в N-й узел
2) Теперь скопируйте произвольную ссылку таким образом
if original->arbitrary is not NULL
original->next->arbitrary = original->arbitrary->next; /*TRAVERSE TWO NODES*/
else
original->next->arbitrary=NULL;
Это работает, потому что оригинал-> следующий - не что иное, как копия оригинала, а Оригинал-> произвольный-> следующий - только копия произвольного.
3) Теперь восстановите исходные и скопируйте связанные списки этим способом в один цикл.
original->next = original->next->next;
copy->next = copy->next->next;
4) Убедитесь, что последний элемент original-> next равен NULL.
Пример кода, Сложность времени O (N), Сложность пространства O (1)
pNode copy_list(pNode head) {
// pre-condition: node->other either points into the list or NULL
if (!head) return NULL;
pNode node = head, copied = NULL, cnode = NULL;
for ( ; node; node = node->next->next) {
// make copy
cnode = newnode(node->next, node->data);
cnode->other = node->other;
if (node == head)
copied = cnode;
// insert the copy between originals
node->next = cnode;
// node -> cnode -> (orig)node->next
}
for (node = head; node && node->next;
node = node->next->next /* only original nodes */)
if (node->other)
node->next->other = node->other->next;
else
node->next->other = NULL;
// restore lists
node = head; cnode = copied;
for ( ; cnode && cnode->next; node = node->next, cnode = cnode->next) {
node->next = node->next->next;
cnode->next = cnode->next->next;
}
node->next = NULL;
return copied;
}
Полная программа в http://gist.github.com/349630