aboutsummaryrefslogtreecommitdiff
path: root/challenge-059/javier-luque/raku
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2020-05-05 10:38:34 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2020-05-05 10:38:34 +0100
commit6cc990ac20b40b91b48dc9ba1383415de5413c5b (patch)
treee201e5f91df3ce118624954c8f038aa41f98c419 /challenge-059/javier-luque/raku
parent7c98c3f14235a3a3e7753e77828b8e98cbd26301 (diff)
downloadperlweeklychallenge-club-6cc990ac20b40b91b48dc9ba1383415de5413c5b.tar.gz
perlweeklychallenge-club-6cc990ac20b40b91b48dc9ba1383415de5413c5b.tar.bz2
perlweeklychallenge-club-6cc990ac20b40b91b48dc9ba1383415de5413c5b.zip
- Updated solutions by Javier Luque.
Diffstat (limited to 'challenge-059/javier-luque/raku')
-rw-r--r--challenge-059/javier-luque/raku/ch-1.p686
1 files changed, 42 insertions, 44 deletions
diff --git a/challenge-059/javier-luque/raku/ch-1.p6 b/challenge-059/javier-luque/raku/ch-1.p6
index ca4849b3a3..1a4843f812 100644
--- a/challenge-059/javier-luque/raku/ch-1.p6
+++ b/challenge-059/javier-luque/raku/ch-1.p6
@@ -27,58 +27,50 @@ class LinkedList {
}
}
- method partition_list(Int $k) {
- # Temp variables to store node locations
- my $k_node_current;
- my $k_node_first;
- my $before_node_current;
- my $before_node_first;
- my $after_node_current;
- my $after_node_first;
-
+ method partition-list(Int $k) {
# Loop through the nodes
my $node = self.first;
+ my $passed_k = False;
+ my $prev_node;
+ my $k_node;
+
while ($node) {
- if ($node.value == $k) {
- if ($k_node_current) {
- $k_node_current.next = $node;
- $k_node_current = $node;
- } else {
- $k_node_first = $node;
- $k_node_current = $node;
- }
- }
+ my $next_node = $node.next;
+ my $moved_node = False;
- # Process the nodex lower than k
- if ($node.value < $k) {
- if ($before_node_current) {
- $before_node_current.next = $node;
- $before_node_current = $node;
- } else {
- $before_node_first = $node;
- $before_node_current = $node;
+ if ($node.value < $k && $passed_k) {
+ my $traverse_node = self.first;
+ while ($traverse_node.next.value < $node.value) {
+ $traverse_node = $traverse_node.next;
}
+ $prev_node.next = $node.next;
+ $node.next = $traverse_node.next;
+ $traverse_node.next = $node;
+ $moved_node = True;
}
- # Process the nodex higher than k
- if ($node.value > $k) {
- if ($after_node_current) {
- $after_node_current.next = $node;
- $after_node_current = $node;
- } else {
- $after_node_first = $node;
- $after_node_current = $node;
- }
- }
+ # Other k's
+ if ($node.value == $k && $passed_k) {
+ my $temp = $k_node.next;
+ $prev_node.next = $node.next;
+ $k_node.next = $node;
+ $node.next = $temp;
+ $moved_node = True;
+ };
+
+ # First k encountered
+ if ($node.value == $k && !$passed_k) {
+ $passed_k = 1;
+ $k_node = $node;
+ };
+
+ # The prev node pointer only changes if we
+ # didn't move the node
+ $prev_node = $node unless ($moved_node);
- $node = $node.next;
+ # Next node
+ $node = $next_node;
}
-
- # link the chains
- self.first = $before_node_first;
- $before_node_current.next = $k_node_first;
- $k_node_current.next = $after_node_first;
- $after_node_current.next = Nil;
}
method display-list {
@@ -99,6 +91,12 @@ sub MAIN() {
my $ll = LinkedList.new();
$ll.create-list(1,4,3,2,5,2);
say 'Before: ' ~ $ll.display-list;
- $ll.partition_list(3);
+ $ll.partition-list(3);
+ say 'After: ' ~ $ll.display-list;
+
+ say "\nDuplicate k's";
+ $ll.create-list(1,4,3,2,5,2,3);
+ say 'Before: ' ~ $ll.display-list;
+ $ll.partition-list(3);
say 'After: ' ~ $ll.display-list;
}