aboutsummaryrefslogtreecommitdiff
path: root/challenge-059/paulo-custodio/python/ch-1.py
diff options
context:
space:
mode:
authorPaulo Custodio <pauloscustodio@gmail.com>2024-09-15 13:03:59 +0100
committerPaulo Custodio <pauloscustodio@gmail.com>2024-09-15 13:03:59 +0100
commit1e1739da53b6ecbe5f17fa6cf3b922ad6ff5d347 (patch)
treeb6c71eae46bba9915a707687817c4acbf9e3ce24 /challenge-059/paulo-custodio/python/ch-1.py
parente806566dab3ce64c5f5498b25bfd0dc52de51709 (diff)
downloadperlweeklychallenge-club-1e1739da53b6ecbe5f17fa6cf3b922ad6ff5d347.tar.gz
perlweeklychallenge-club-1e1739da53b6ecbe5f17fa6cf3b922ad6ff5d347.tar.bz2
perlweeklychallenge-club-1e1739da53b6ecbe5f17fa6cf3b922ad6ff5d347.zip
Add Python solution to challenge 059
Diffstat (limited to 'challenge-059/paulo-custodio/python/ch-1.py')
-rw-r--r--challenge-059/paulo-custodio/python/ch-1.py114
1 files changed, 114 insertions, 0 deletions
diff --git a/challenge-059/paulo-custodio/python/ch-1.py b/challenge-059/paulo-custodio/python/ch-1.py
new file mode 100644
index 0000000000..2451591238
--- /dev/null
+++ b/challenge-059/paulo-custodio/python/ch-1.py
@@ -0,0 +1,114 @@
+#!/usr/bin/env python3
+
+# Challenge 059
+#
+# TASK #1 › Linked List
+# Reviewed by Ryan Thompson
+# You are given a linked list and a value k. Write a script to partition the
+# linked list such that all nodes less than k come before nodes greater than or
+# equal to k. Make sure you preserve the original relative order of the nodes in
+# each of the two partitions.
+#
+# For example:
+#
+# Linked List: 1 -> 4 -> 3 -> 2 -> 5 -> 2
+#
+# k = 3
+#
+# Expected Output: 1 -> 2 -> 2 -> 4 -> 3 -> 5.
+
+import sys
+
+class Node:
+ def __init__(self, data):
+ self.data = data
+ self.next = None
+
+ def __str__(self):
+ out = "["+str(self.data)
+ if self.next:
+ return out+","+str(self.next)+"]"
+ else:
+ return out+"]"
+
+class LinkedList:
+ def __init__(self):
+ self.head = None
+
+ def __str__(self):
+ out = ""
+ current = self.head
+ while current:
+ out += str(current.data)+" -> "
+ current = current.next
+ out += "None"
+ return out
+
+ def push_front(self, data):
+ new_node = Node(data)
+ new_node.next = self.head
+ self.head = new_node
+
+ def push_back(self, data):
+ new_node = Node(data)
+ if not self.head:
+ self.head = new_node
+ else:
+ last_node = self.head
+ while last_node.next:
+ last_node = last_node.next
+ last_node.next = new_node
+
+ def insert_at(self, index, data):
+ if index == 0:
+ self.push_front(data)
+ else:
+ new_node = Node(data)
+ current = self.head
+ for _ in range(index - 1):
+ if not current:
+ raise IndexError("Index out of bounds")
+ current = current.next
+ new_node.next = current.next
+ current.next = new_node
+
+ def remove_node(self, key):
+ current = self.head
+ if current and current.data == key:
+ self.head = current.next
+ current = None
+ else:
+ prev = None
+ while current and current.data != key:
+ prev = current
+ current = current.next
+ if current:
+ prev.next = current.next
+ current = None
+
+def partition(list, k):
+ below = LinkedList()
+ above = LinkedList()
+
+ p = list.head
+ while p:
+ if p.data < k:
+ below.push_back(p.data)
+ else:
+ above.push_back(p.data)
+ p = p.next
+
+ list = below
+ p = above.head
+ while p:
+ list.push_back(p.data)
+ p = p.next
+
+ return list
+
+k = int(sys.argv[1])
+list = LinkedList()
+for x in sys.argv[2:]:
+ list.push_back(int(x))
+list = partition(list, k)
+print(list)