aboutsummaryrefslogtreecommitdiff
path: root/challenge-071/dave-jacoby/perl/ch-2b.pl
blob: e390ff3eff361d16d4883120a3163de2e0d8b76e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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};
    }
}