Introduction to Practical Linked List Exercises with Kotlin

Introduction to the Lesson

Today's lesson will build upon our foundational understanding of linked lists by diving into practical implementation exercises using Kotlin. These problems sharpen your coding skills and prepare you for scenarios you might encounter in technical interviews.

Problem 1: Reverse Linked List Traversal

Picture a scenario in which you have a sequence of events stored in a linked list. Your task is to look back in time — essentially, to reverse the chronology of these events. In technical terms, this means traversing a singly linked list in reverse order while keeping its structure intact. This skill is critical, whether for reversing transaction logs or simply navigating through a playlist from end to start.

Problem 1: Problem Actualization

Consider a browser's back-button functionality, where the most recently visited pages must be revisited in reverse order. This operation mirrors our task of reverse traversal in a linked list, capturing the essence of a real-world application.

Problem 1: Naive Approach

One may consider creating a new linked list while iterating over the original list, inserting each element at the head of the new list. Although this approach might work, it is an overcomplicated solution that results in extra processing and memory usage that we can avoid.

Problem 1: Efficient Approach Explanation

A more sophisticated solution would use a stack. Using a stack, we ensure an orderly collection of the nodes' values as we navigate the list. Once the traversal is complete, we extract the values in reverse, thanks to the stack's Last-In-First-Out property.

Let's visualize it with a deck of cards: We pick each card from the top (the head of the linked list) and place it into a pile (the stack). When we finish, we pick up the cards from the pile now in reverse order.

Problem 1: Solution Building

Let's tackle it with Kotlin:

// Instantiate a stack using ArrayDeque to hold node values.
val stack = ArrayDeque<Int>()

// Traverse the linked list and push node values to the stack.
var currentNode = head
while (currentNode != null) {
    stack.addLast(currentNode.value)
    currentNode = currentNode.next
}

// Pop from the stack to obtain elements in reversed order.
while (stack.isNotEmpty()) {
    println(stack.removeLast())
}

In this code, we utilize ArrayDeque as the stack to store integers. Like before, we iterate through the linked list, adding each node value to the stack using addLast(). When reversing, we access and remove elements using removeLast(), following the stack's Last-In-First-Out behavior. This implementation with ArrayDeque offers performance advantages, as it's specifically optimized for stack-like operations.

Sign up

Join the 1M+ learners on CodeSignal

Be a part of our community of 1M+ users who develop and demonstrate their skills on CodeSignal