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};
}
}
|