CodeViz / tools /visualizer_linked_list.py
TD-jayadeera's picture
Implement initial project structure and setup
26ee80c
import base64
from io import BytesIO
from PIL import Image, ImageDraw, ImageFont
def draw_linked_list_frame(nodes):
"""
Given a list of node values (strings), return a PIL Image representing the current state.
"""
width = max(600, len(nodes) * 120)
img = Image.new('RGB', (width, 100), color='white')
draw = ImageDraw.Draw(img)
font = ImageFont.load_default()
for i, val in enumerate(nodes):
x0 = i * 100 + 10
# Draw node rectangle
draw.rectangle([x0, 30, x0 + 80, 70], outline='black', width=2)
draw.text((x0 + 25, 40), val, fill='black', font=font)
# Draw arrow to next node if exists
if i < len(nodes) - 1:
draw.line((x0 + 80, 50, x0 + 100, 50), fill='black', width=2)
return img
def generate_linked_list_gif(operations, output_path):
"""
Given a list of operations like ["insert 5", "insert 10", "delete"], build a sequence of frames,
then save as an animated GIF to output_path.
"""
frames = []
nodes = []
for op in operations:
parts = op.split()
if len(parts) >= 2 and parts[0] == "insert":
nodes.append(parts[1])
elif parts[0] == "delete":
if nodes:
nodes.pop(0) # delete head
# Draw current state
img = draw_linked_list_frame(nodes)
frames.append(img)
# Save frames as GIF
frames[0].save(
output_path,
save_all=True,
append_images=frames[1:],
duration=800,
loop=0
)
return output_path