aboutsummaryrefslogtreecommitdiff
path: root/challenge-068/javier-luque/raku/ch-2.p6
blob: 49d77e573b1267f4d953ee8cb1c08fd5e9585535 (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
# Test: perl6 ch-2.p6
class LinkedList::Node {
	has Int $.value is rw;
	has LinkedList::Node $.next is rw;
}

class LinkedList {
	has LinkedList::Node $.first is rw;

	# Create the list
	method create-list(*@values) {
		my $prev_node;

		# Populate the list
		for @values -> $value {
			my $node = LinkedList::Node.new(value => $value);

			# Populate first and next nodes
			if ($prev_node) {
				$prev_node.next = $node
			} else {
				self.first = $node;
			}

			# Next node
			$prev_node = $node;
		}
	}

	method reorder-list(Int $k) {
		# Loop through the nodes
		my $node = self.first;

		# Process each node
		while ($node) {
			my $next_node = $node.next;
			my $traverse_node = $node;
			my $last_node = $node;

			# Traverse Linked list
			while ($traverse_node.next) {
				$last_node = $traverse_node;
				$traverse_node = $traverse_node.next;
			}

			# Move the nodes around
			$node.next = $traverse_node;
			if ($next_node && $next_node.next) {
				$traverse_node.next = $next_node;
				$last_node.next = Nil;
			} else {
				$traverse_node.next = Nil;
			}

			# Next node
			$node = $next_node;
		}
	}

	method display-list {
		my $node = self.first;
		my @keys;

		while ($node) {
			@keys.push($node.value);
			$node = $node.next;
		}

		return @keys.join(" → ");
	}
}


sub MAIN() {
	my $ll = LinkedList.new();
	$ll.create-list(1,2,3,4);
	say 'Before: ' ~ $ll.display-list;
	$ll.reorder-list(3);
	say 'After: ' ~ $ll.display-list;
}