sub insert_after { my ($previous, $val) = @_; my $curr_next = $previous->{next}; $previous->{next} = { "data" => $val , "next" => $curr_next, "prev" => $previous, }; my $new_next = $previous->{next}; $curr_next->{prev} = $new_next if defined $curr_next; return $new_next; } sub insert_before { # simply call insert_after on the previous node my ($previous, $val) = @_; return insert_after($previous->{prev}, $val); }