aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWalt Mankowski <waltman@pobox.com>2020-07-06 20:48:04 -0400
committerWalt Mankowski <waltman@pobox.com>2020-07-06 20:48:04 -0400
commita23cb92fb4c15529c9a1a28b96ca25b7610c6c11 (patch)
tree5e743994b62efb9950aeed78d0d4aeb96581fff4
parent568abe5d0671b21af806c46d47108067727c2e50 (diff)
downloadperlweeklychallenge-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.pm30
-rw-r--r--challenge-068/walt-mankowski/perl/ch-2.pl68
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);
+ }
+}