aboutsummaryrefslogtreecommitdiff
path: root/challenge-071
diff options
context:
space:
mode:
authorDave Jacoby <jacoby.david@gmail.com>2020-07-30 16:33:51 -0400
committerDave Jacoby <jacoby.david@gmail.com>2020-07-30 16:33:51 -0400
commit76ab89fd6cb452d0ecf26bd42fa4ae88177817ec (patch)
tree0bdee4ab7df281cdc8c6193179fe4d36221fdb76 /challenge-071
parent6489fa1d4fc6a45637d3083b172f6cbda01417aa (diff)
downloadperlweeklychallenge-club-76ab89fd6cb452d0ecf26bd42fa4ae88177817ec.tar.gz
perlweeklychallenge-club-76ab89fd6cb452d0ecf26bd42fa4ae88177817ec.tar.bz2
perlweeklychallenge-club-76ab89fd6cb452d0ecf26bd42fa4ae88177817ec.zip
Task 2: this time with a SINGLY-linked list
Diffstat (limited to 'challenge-071')
-rwxr-xr-xchallenge-071/dave-jacoby/perl/ch-2b.pl120
1 files changed, 120 insertions, 0 deletions
diff --git a/challenge-071/dave-jacoby/perl/ch-2b.pl b/challenge-071/dave-jacoby/perl/ch-2b.pl
new file mode 100755
index 0000000000..e390ff3eff
--- /dev/null
+++ b/challenge-071/dave-jacoby/perl/ch-2b.pl
@@ -0,0 +1,120 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+use feature qw{ say signatures state };
+no warnings qw{ experimental };
+
+use Getopt::Long;
+my $n = 1;
+GetOptions( 'number=i' => \$n, );
+
+my $start = Node->new('0');
+for my $i ( 1 .. 5 ) {
+ my $last = get_last($start);
+ $last->next( Node->new($i) );
+}
+
+# show_list($start->next); #so we don't get the start node
+trim_list( $start, $n );
+
+exit;
+
+sub trim_list ( $link, $n = 1 ) {
+
+ # how big is the linked list?
+ my $i = 0;
+ my $s = $link;
+
+ while ( defined $s ) {
+ $i++;
+ $s = $s->{next};
+ }
+ my $stop = $i - $n;
+ $stop = $stop < 1 ? 1 : $stop;
+
+ my $k = 1;
+ $s = $link;
+ while ( $s->next ) {
+ if ( $stop == $k ) {
+ $s->remove_next;
+ last;
+ }
+ $s = $s->next;
+ $k++;
+ }
+ show_list( $start->next );
+}
+
+sub show_list( $link ) {
+ while ( defined $link ) {
+ print $link->{value} || '';
+ if ( defined $link->{next} ) {
+ print ' -> '
+ if defined $link->{next};
+ }
+ else { print "\n" if !defined $link->{next}; }
+ $link = $link->{next};
+ }
+}
+
+sub get_last( $node ) {
+ return get_last( $node->next ) if $node->next;
+ return $node;
+}
+
+# copied and pasted from my Challenge #59 code
+
+######### ######### ######### ######### ######### ######### #########
+# The same old Node code, but instead of left and right,
+# it just has next
+
+######### ######### ######### ######### ######### ######### #########
+# Now a singly-linked list, meaning no pointing back to the start
+
+package Node;
+
+sub new ( $class, $value = 0 ) {
+ my $self = {};
+ $self->{value} = $value;
+ $self->{next} = undef;
+
+ # $self->{parent} = undef;
+ return bless $self, $class;
+}
+
+sub value ( $self ) {
+ return $self->{value};
+}
+
+# sub is_root ( $self ) {
+# return defined $self->{parent} ? 0 : 1;
+# }
+
+sub is_leaf ( $self ) {
+ return ( !defined $self->{left} && !defined $self->{right} )
+ ? 1
+ : 0;
+}
+
+sub next ( $self, $node = undef ) {
+ if ( defined $node ) {
+ $self->{next} = $node;
+
+ # $node->{parent} = $self;
+ }
+ else {
+ return $self->{next};
+ }
+}
+
+# sub parent ($self ) {
+# return $self->{parent};
+# }
+
+sub remove_next( $self ) {
+ my $next = $self->{next};
+ if ( defined $next ) {
+ $self->{next} = $next->{next};
+ }
+}