Skip to content

Commit bfc015f

Browse files
Copy list with random pointer
Signed-off-by: Leo Ma <begeekmyfriend@gmail.com>
1 parent e6b82a9 commit bfc015f

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
all:
2+
gcc -O2 -o test copy_list.c
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#include <stdio.h>
2+
#include <stdlib.h>
3+
4+
struct RandomListNode {
5+
int label;
6+
struct RandomListNode *next;
7+
struct RandomListNode *random;
8+
};
9+
10+
static struct RandomListNode *copyRandomList(struct RandomListNode *head)
11+
{
12+
if (head == NULL) {
13+
return NULL;
14+
}
15+
16+
struct RandomListNode *p, *new;
17+
for (p = head; p != NULL; p = p->next->next) {
18+
new = malloc(sizeof(*new));
19+
new->label = p->label;
20+
new->next = p->next;
21+
p->next = new;
22+
}
23+
24+
for (p = head; p != NULL; p = p->next->next) {
25+
new = p->next;
26+
new->random = p->random != NULL ? p->random->next : NULL;
27+
}
28+
29+
struct RandomListNode dummy;
30+
struct RandomListNode *prev = &dummy;
31+
for (p = head; p != NULL; p = p->next) {
32+
new = p->next;
33+
p->next = new->next;
34+
prev->next = new;
35+
prev = new;
36+
new->next = NULL;
37+
}
38+
39+
return dummy.next;
40+
}
41+
42+
int main(int argc, char **argv)
43+
{
44+
int i, count = argc - 1;
45+
struct RandomListNode *head = NULL, *p, *prev;
46+
for (i = 0; i < count; i++) {
47+
p = malloc(sizeof(*p));
48+
p->label = atoi(argv[i + 1]);
49+
p->next = NULL;
50+
p->random = NULL;
51+
if (head == NULL) {
52+
head = p;
53+
} else {
54+
prev->next = p;
55+
prev->random = p;
56+
}
57+
prev = p;
58+
}
59+
60+
struct RandomListNode *r = head;
61+
struct RandomListNode *q = p = copyRandomList(head);
62+
63+
for (r = head; r != NULL; r = r->next) {
64+
printf("%d ", r->label);
65+
}
66+
printf("\n");
67+
68+
for (r = head; r != NULL; r = r->random) {
69+
printf("%d ", r->label);
70+
}
71+
printf("\n");
72+
73+
for (; p != NULL; p = p->next) {
74+
printf("%d ", p->label);
75+
}
76+
printf("\n");
77+
78+
for (; q != NULL; q = q->random) {
79+
printf("%d ", q->label);
80+
}
81+
printf("\n");
82+
return 0;
83+
}

0 commit comments

Comments
 (0)