diff options
| author | Walt Mankowski <waltman@pobox.com> | 2020-07-06 20:48:04 -0400 |
|---|---|---|
| committer | Walt Mankowski <waltman@pobox.com> | 2020-07-06 20:48:04 -0400 |
| commit | a23cb92fb4c15529c9a1a28b96ca25b7610c6c11 (patch) | |
| tree | 5e743994b62efb9950aeed78d0d4aeb96581fff4 | |
| parent | 568abe5d0671b21af806c46d47108067727c2e50 (diff) | |
| download | perlweeklychallenge-club-a23cb92fb4c15529c9a1a28b96ca25b7610c6c11.tar.gz perlweeklychallenge-club-a23cb92fb4c15529c9a1a28b96ca25b7610c6c11.tar.bz2 perlweeklychallenge-club-a23cb92fb4c15529c9a1a28b96ca25b7610c6c11.zip | |
Perl code for challenge 68 task 2
| -rw-r--r-- | challenge-068/walt-mankowski/perl/Node.pm | 30 | ||||
| -rw-r--r-- | challenge-068/walt-mankowski/perl/ch-2.pl | 68 |
2 files changed, 98 insertions, 0 deletions
diff --git a/challenge-068/walt-mankowski/perl/Node.pm b/challenge-068/walt-mankowski/perl/Node.pm new file mode 100644 index 0000000000..7f749b5c15 --- /dev/null +++ b/challenge-068/walt-mankowski/perl/Node.pm @@ -0,0 +1,30 @@ +package Node; + +use strict; +use warnings; +use feature qw(:5.32); +use experimental qw(signatures); + +sub new($package, $val) { + my $self = {}; + bless $self, $package; + + $self->{val} = $val; + $self->{next} = undef; + + return $self; +} + +sub set_next($self, $node) { + $self->{next} = $node; +} + +sub next($self) { + return $self->{next}; +} + +sub val($self) { + return $self->{val}; +} + +1; diff --git a/challenge-068/walt-mankowski/perl/ch-2.pl b/challenge-068/walt-mankowski/perl/ch-2.pl new file mode 100644 index 0000000000..d67e2f2426 --- /dev/null +++ b/challenge-068/walt-mankowski/perl/ch-2.pl @@ -0,0 +1,68 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use feature qw(:5.32); +use experimental qw(signatures); +use lib '.'; +use Node; + +# TASK #2 › Reorder List +# Submitted by: Mohammad S Anwar +# +# You are given a singly linked list $L as below: +# +# L0 → L1 → … → Ln-1 → Ln +# +# Write a script to reorder list as below: +# +# L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → +# +# You are ONLY allowed to do this in-place without altering the nodes’ values. +# Example +# +# Input: 1 → 2 → 3 → 4 +# Output: 1 → 4 → 2 → 3 + +my $list = make_list(1..10); +print_list($list); +reorder_list($list); +print_list($list); + +sub make_list(@a) { + my $list = Node->new(shift @a); + my $cur = $list; + for my $val (@a) { + my $node = Node->new($val); + $cur->set_next($node); + $cur = $node; + } + return $list; +} + +sub print_list($list) { + while (defined($list)) { + print $list->val; + if (defined($list->next)) { + print " => "; + } + $list = $list->next; + } + print "\n"; +} + +sub reorder_list($list) { + # save the nodes in an array + my @a; + while (defined $list) { + push @a, $list; + $list = $list->next; + } + + # now reorder things + my $n = $#a; + for my $i (0..$n / 2 - 1) { + $a[$n-$i]->set_next($a[$i]->next); + $a[$i]->set_next($a[$n-$i]); + $a[$n-$i-1]->set_next(undef); + } +} |
