File tree Expand file tree Collapse file tree 1 file changed +17
-21
lines changed
138_copy_list_with_random_pointer Expand file tree Collapse file tree 1 file changed +17
-21
lines changed Original file line number Diff line number Diff line change @@ -9,35 +9,31 @@ struct Node {
9
9
10
10
static struct Node * copyRandomList (struct Node * head )
11
11
{
12
- if (head == NULL ) {
13
- return NULL ;
14
- }
15
-
16
- /* copy and redirect next pointer */
17
- struct Node * p , * new ;
18
- for (p = head ; p != NULL ; p = p -> next -> next ) {
19
- new = malloc (sizeof (* new ));
20
- new -> val = p -> val ;
21
- new -> next = p -> next ;
22
- p -> next = new ;
12
+ struct Node * p , * q ;
13
+ /* insert interleavingly */
14
+ for (p = head ; p != NULL ; p = q -> next ) {
15
+ q = malloc (sizeof (* q ));
16
+ q -> val = p -> val ;
17
+ q -> next = p -> next ;
18
+ p -> next = q ;
23
19
}
24
20
25
21
/* clone random pointer */
26
- for (p = head ; p != NULL ; p = p -> next -> next ) {
27
- new = p -> next ;
28
- new -> random = p -> random != NULL ? p -> random -> next : NULL ;
22
+ for (p = head ; p != NULL ; p = q -> next ) {
23
+ q = p -> next ;
24
+ q -> random = p -> random != NULL ? p -> random -> next : NULL ;
29
25
}
30
26
31
27
struct Node dummy ;
32
28
struct Node * prev = & dummy ;
33
- for (p = head ; p != NULL ; p = p -> next ) {
34
- new = p -> next ;
35
- p -> next = new -> next ;
36
- /* correct the actual next pointer of the new list */
37
- prev -> next = new ;
38
- prev = new ;
39
- new -> next = NULL ;
29
+ prev -> next = head ;
30
+ for (p = head ; p != NULL ; p = q -> next ) {
31
+ q = p -> next ;
32
+ /* separate q list */
33
+ prev -> next = q ;
34
+ prev = q ;
40
35
}
36
+ /* q->next = NULL */
41
37
42
38
return dummy .next ;
43
39
}
You can’t perform that action at this time.
0 commit comments