@@ -67,28 +67,21 @@ impl Graph {
67
67
}
68
68
}
69
69
70
- fn euler_helper ( & self , u : usize , adj : & mut [ AdjListIterator ] )
71
- -> :: std:: collections:: LinkedList < usize > {
72
- let mut edges = :: std:: collections:: LinkedList :: new ( ) ;
73
- if let Some ( ( e, v) ) = adj[ u] . next ( ) {
74
- let mut tail_path = self . euler_helper ( v, adj) ;
75
- if let Some ( ( e2, v2) ) = adj[ u] . next ( ) {
76
- edges. push_back ( e2) ;
77
- edges. append ( & mut self . euler_helper ( v2, adj) ) ;
78
- }
79
- edges. push_back ( e) ;
80
- edges. append ( & mut tail_path) ;
81
- assert_eq ! ( None , adj[ u] . next( ) ) ;
70
+ fn euler_helper ( & self , u : usize , adj : & mut [ AdjListIterator ] , edges : & mut Vec < usize > ) {
71
+ while let Some ( ( e, v) ) = adj[ u] . next ( ) {
72
+ self . euler_helper ( v, adj, edges) ;
73
+ edges. push ( e) ;
82
74
}
83
- edges
84
75
}
85
76
86
77
// Finds an Euler path starting from u, assuming it exists, and that the
87
78
// graph is directed.
88
- pub fn euler_path ( & self , u : usize ) -> :: std :: collections :: LinkedList < usize > {
79
+ pub fn euler_path ( & self , u : usize ) -> Vec < usize > {
89
80
let mut adj_iters = ( 0 ..self . num_v ( ) ) . map ( |u| self . adj_list ( u) )
90
81
. collect :: < Vec < _ > > ( ) ;
91
- self . euler_helper ( u, & mut adj_iters)
82
+ let mut edges = Vec :: with_capacity ( self . num_e ( ) ) ;
83
+ self . euler_helper ( u, & mut adj_iters, & mut edges) ;
84
+ edges. into_iter ( ) . rev ( ) . collect ( )
92
85
}
93
86
}
94
87
@@ -352,8 +345,7 @@ mod test {
352
345
graph. add_edge ( 1 , 0 ) ;
353
346
graph. add_edge ( 1 , 2 ) ;
354
347
graph. add_edge ( 2 , 1 ) ;
355
- let euler = graph. euler_path ( 0 ) . into_iter ( ) . collect :: < Vec < _ > > ( ) ;
356
- assert_eq ! ( euler, vec![ 0 , 2 , 3 , 1 ] ) ;
348
+ assert_eq ! ( graph. euler_path( 0 ) , vec![ 0 , 2 , 3 , 1 ] ) ;
357
349
}
358
350
359
351
#[ test]
0 commit comments