From a23cb92fb4c15529c9a1a28b96ca25b7610c6c11 Mon Sep 17 00:00:00 2001 From: Walt Mankowski Date: Mon, 6 Jul 2020 20:48:04 -0400 Subject: Perl code for challenge 68 task 2 --- challenge-068/walt-mankowski/perl/Node.pm | 30 ++++++++++++++ challenge-068/walt-mankowski/perl/ch-2.pl | 68 +++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 challenge-068/walt-mankowski/perl/Node.pm create mode 100644 challenge-068/walt-mankowski/perl/ch-2.pl 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); + } +} -- cgit