Bird
Raised Fist0
DSA C#programming

Traversal Forward and Backward in DSA C#

Choose your learning style10 modes available
Mental Model
Traversal means visiting each item in a list one by one, either from start to end or from end to start.
Analogy: Imagine walking through a line of people holding hands. Going forward means walking from the first person to the last, and going backward means walking from the last person back to the first.
Head -> 1 -> 2 -> 3 -> null
Tail ← 1 ← 2 ← 3 ← null
↑ forward pointer at 1
↑ backward pointer at 3
Dry Run Walkthrough
Input: list: 1 -> 2 -> 3, traverse forward and then backward
Goal: Visit and print all nodes from start to end, then from end to start
Step 1: Start forward traversal at head node 1
1 [curr->] -> 2 -> 3 -> null
Why: We begin at the first node to visit all nodes forward
Step 2: Move forward pointer to node 2
1 -> 2 [curr->] -> 3 -> null
Why: Visit next node in forward direction
Step 3: Move forward pointer to node 3
1 -> 2 -> 3 [curr->] -> null
Why: Visit last node in forward direction
Step 4: Start backward traversal at tail node 3
null ← 1 ← 2 ← 3 [curr←]
Why: Begin visiting nodes backward from the last node
Step 5: Move backward pointer to node 2
null ← 1 ← 2 [curr←] ← 3
Why: Visit previous node in backward direction
Step 6: Move backward pointer to node 1
null ← 1 [curr←] ← 2 ← 3
Why: Visit first node in backward direction
Result:
Forward traversal: 1 -> 2 -> 3 -> null
Backward traversal: 3 -> 2 -> 1 -> null
Annotated Code
DSA C#
using System;

class Node
{
    public int data;
    public Node next;
    public Node prev;

    public Node(int data)
    {
        this.data = data;
        this.next = null;
        this.prev = null;
    }
}

class DoublyLinkedList
{
    public Node head;
    public Node tail;

    public void AddLast(int data)
    {
        Node newNode = new Node(data);
        if (head == null)
        {
            head = newNode;
            tail = newNode;
        }
        else
        {
            tail.next = newNode; // link current tail to new node
            newNode.prev = tail; // link new node back to current tail
            tail = newNode;      // update tail to new node
        }
    }

    public void TraverseForward()
    {
        Node curr = head;
        while (curr != null)
        {
            Console.Write(curr.data);
            if (curr.next != null) Console.Write(" -> ");
            curr = curr.next; // move forward to next node
        }
        Console.WriteLine(" -> null");
    }

    public void TraverseBackward()
    {
        Node curr = tail;
        while (curr != null)
        {
            Console.Write(curr.data);
            if (curr.prev != null) Console.Write(" -> ");
            curr = curr.prev; // move backward to previous node
        }
        Console.WriteLine(" -> null");
    }
}

class Program
{
    static void Main()
    {
        DoublyLinkedList list = new DoublyLinkedList();
        list.AddLast(1);
        list.AddLast(2);
        list.AddLast(3);

        Console.Write("Forward traversal: ");
        list.TraverseForward();

        Console.Write("Backward traversal: ");
        list.TraverseBackward();
    }
}
tail.next = newNode; // link current tail to new node
connect current last node forward to new node
newNode.prev = tail; // link new node back to current tail
connect new node backward to current last node
curr = curr.next; // move forward to next node
advance forward pointer to next node
curr = curr.prev; // move backward to previous node
advance backward pointer to previous node
OutputSuccess
Forward traversal: 1 -> 2 -> 3 -> null Backward traversal: 3 -> 2 -> 1 -> null
Complexity Analysis
Time: O(n) because we visit each node once during traversal
Space: O(1) because traversal uses only a few pointers, no extra space per node
vs Alternative: Compared to singly linked list, backward traversal is not possible without extra work; doubly linked list allows easy backward traversal with same O(n) time
Edge Cases
empty list
traversal prints nothing except '-> null'
DSA C#
while (curr != null)
single node list
forward and backward traversal print the single node once
DSA C#
while (curr != null)
When to Use This Pattern
When you need to visit elements in both directions easily, use doubly linked list traversal to move forward and backward through nodes.
Common Mistakes
Mistake: Trying to move backward in a singly linked list without a prev pointer
Fix: Use a doubly linked list that stores a prev pointer for backward traversal
Mistake: Not updating tail pointer when adding nodes
Fix: Always update tail to the new last node after insertion
Summary
It visits all nodes in a doubly linked list from start to end and then from end to start.
Use it when you want to read or process data in both forward and backward order easily.
The key is that each node links to both next and previous nodes, allowing two-way movement.

Practice

(1/5)
1. What does Traversal Forward and Backward mean in the context of a doubly linked list?
easy
A. Visiting nodes from the start to the end and then from the end back to the start
B. Only visiting nodes from the start to the end
C. Visiting nodes randomly without order
D. Visiting nodes only from the end to the start

Solution

  1. Step 1: Understand traversal directions

    Traversal forward means visiting nodes from the first node to the last node. Traversal backward means visiting nodes from the last node back to the first node.
  2. Step 2: Apply to doubly linked list

    A doubly linked list allows moving in both directions because each node has links to the next and previous nodes.
  3. Final Answer:

    Visiting nodes from the start to the end and then from the end back to the start -> Option A
  4. Quick Check:

    Forward and backward traversal = visiting nodes both ways [OK]
Hint: Think of walking forward then turning back [OK]
Common Mistakes:
  • Confusing traversal with random access
  • Thinking traversal is only forward
  • Ignoring backward links in doubly linked list
2. Which of the following is the correct syntax to traverse a doubly linked list forward in C#?
easy
A. for(Node current = tail; current != null; current = current.Next) { /* process current */ }
B. for(Node current = head; current != null; current = current.Next) { /* process current */ }
C. for(Node current = head; current != null; current = current.Prev) { /* process current */ }
D. for(Node current = tail; current != null; current = current.Prev) { /* process current */ }

Solution

  1. Step 1: Identify forward traversal

    Forward traversal starts at the head and moves to the next node repeatedly until null.
  2. Step 2: Check syntax correctness

    for(Node current = head; current != null; current = current.Next) { /* process current */ } correctly starts at head and moves using current = current.Next. Other options either start at tail or move backward.
  3. Final Answer:

    for(Node current = head; current != null; current = current.Next) { /* process current */ } -> Option B
  4. Quick Check:

    Forward traversal uses Next pointer from head [OK]
Hint: Forward means start at head and use Next [OK]
Common Mistakes:
  • Starting at tail for forward traversal
  • Using Prev pointer for forward traversal
  • Confusing Next and Prev pointers
3. Given the doubly linked list with nodes containing values 1, 2, 3, 4, what is the output of this forward traversal code?
Node current = head;
while(current != null) {
    Console.Write(current.Value + " -> ");
    current = current.Next;
}
Console.WriteLine("null");
medium
A. null
B. 4 -> 3 -> 2 -> 1 -> null
C. 1 -> 2 -> 3 -> 4 -> null
D. 1 -> 2 -> 3 -> null

Solution

  1. Step 1: Understand the list structure

    The list nodes are 1 linked to 2, then 3, then 4, in order.
  2. Step 2: Trace the forward traversal

    Starting at head (1), print 1, move to 2, print 2, move to 3, print 3, move to 4, print 4, then current becomes null and loop ends.
  3. Final Answer:

    1 -> 2 -> 3 -> 4 -> null -> Option C
  4. Quick Check:

    Forward traversal prints nodes in order [OK]
Hint: Follow Next pointers from head to null [OK]
Common Mistakes:
  • Printing backward order instead of forward
  • Missing last node in output
  • Printing null before nodes
4. Identify the error in this backward traversal code of a doubly linked list:
Node current = head;
while(current != null) {
    Console.Write(current.Value + " <- ");
    current = current.Prev;
}
Console.WriteLine("null");
medium
A. Missing null check in loop
B. Using Prev pointer instead of Next
C. Incorrect print format
D. Starting traversal from head instead of tail

Solution

  1. Step 1: Understand backward traversal

    Backward traversal should start from the tail node, not the head.
  2. Step 2: Analyze given code

    The code starts at head and tries to move backward using Prev, but head.Prev is null, so loop ends immediately.
  3. Final Answer:

    Starting traversal from head instead of tail -> Option D
  4. Quick Check:

    Backward traversal must start at tail [OK]
Hint: Backward means start at tail, not head [OK]
Common Mistakes:
  • Starting backward traversal at head
  • Confusing Prev and Next pointers
  • Ignoring list ends (null pointers)
5. You have a doubly linked list with nodes: 10 <-> 20 <-> 30 <-> 40. Write a method to print the list forward and then backward without using extra data structures. What will be the output?
hard
A. 10 -> 20 -> 30 -> 40 -> null 40 -> 30 -> 20 -> 10 -> null
B. 40 -> 30 -> 20 -> 10 -> null 10 -> 20 -> 30 -> 40 -> null
C. 10 -> 20 -> 30 -> 40 -> null null
D. null 40 -> 30 -> 20 -> 10 -> null

Solution

  1. Step 1: Traverse forward from head to tail

    Start at head (10), print each node's value moving via Next until null: 10 -> 20 -> 30 -> 40 -> null.
  2. Step 2: Traverse backward from tail to head

    After reaching tail (40), move backward using Prev pointer, printing: 40 -> 30 -> 20 -> 10 -> null.
  3. Final Answer:

    10 -> 20 -> 30 -> 40 -> null 40 -> 30 -> 20 -> 10 -> null -> Option A
  4. Quick Check:

    Forward then backward traversal prints nodes in both directions [OK]
Hint: Print forward using Next, backward using Prev [OK]
Common Mistakes:
  • Trying to traverse backward from head
  • Printing null before nodes
  • Using extra data structures unnecessarily
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard