Bird
Raised Fist0
DSA Cprogramming~5 mins

Traversal Forward and Backward in DSA C - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Traversal Forward and Backward
O(n)
Understanding Time Complexity

We want to understand how long it takes to move through a list from start to end and then back from end to start.

How does the time needed change as the list gets bigger?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


void traverseForwardBackward(int arr[], int n) {
    // Traverse forward
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    // Traverse backward
    for (int i = n - 1; i >= 0; i--) {
        printf("%d ", arr[i]);
    }
}
    

This code prints all elements of an array first from the start to the end, then from the end back to the start.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: Two separate loops that each visit every element once.
  • How many times: Each loop runs exactly n times, where n is the number of elements.
How Execution Grows With Input

As the list size grows, the total steps grow roughly twice as fast because we go forward and backward.

Input Size (n)Approx. Operations
1020 (10 forward + 10 backward)
100200 (100 forward + 100 backward)
10002000 (1000 forward + 1000 backward)

Pattern observation: The total steps double as input size doubles, showing a linear growth pattern.

Final Time Complexity

Time Complexity: O(n)

This means the time to complete the traversal grows directly in proportion to the number of elements.

Common Mistake

[X] Wrong: "Because there are two loops, the time complexity is O(n²)."

[OK] Correct: The loops run one after another, not nested. So their times add up, not multiply.

Interview Connect

Understanding how simple traversals add up helps you explain and optimize code clearly in interviews.

Self-Check

"What if we combined the forward and backward traversals into a single loop that prints both directions simultaneously? How would the time complexity change?"

Practice

(1/5)
1. What does forward traversal in a linked list mean?
easy
A. Visiting nodes from the first node to the last node
B. Visiting nodes from the last node to the first node
C. Skipping every alternate node while visiting
D. Visiting nodes randomly

Solution

  1. Step 1: Understand forward traversal

    Forward traversal means starting at the first node and moving to the next node repeatedly until the end.
  2. Step 2: Compare with options

    Only Visiting nodes from the first node to the last node describes visiting nodes from first to last, which matches forward traversal.
  3. Final Answer:

    Visiting nodes from the first node to the last node -> Option A
  4. Quick Check:

    Forward traversal = first to last [OK]
Hint: Forward means start to end in order [OK]
Common Mistakes:
  • Confusing forward with backward traversal
  • Thinking traversal is random
  • Assuming skipping nodes is traversal
2. Which of the following is the correct syntax to traverse a singly linked list forward in C?
easy
A. for(Node* curr = head; curr != NULL; curr = curr->prev) { /* process curr */ }
B. for(Node* curr = head; curr != NULL; curr = curr->next) { /* process curr */ }
C. while(head != NULL) { head = head->prev; }
D. for(Node* curr = tail; curr != NULL; curr = curr->prev) { /* process curr */ }

Solution

  1. Step 1: Identify forward traversal syntax

    Forward traversal in singly linked list uses next pointer starting from head.
  2. Step 2: Check options for correct pointer usage

    for(Node* curr = head; curr != NULL; curr = curr->next) { /* process curr */ } uses curr = curr->next starting from head, which is correct.
  3. Final Answer:

    for(Node* curr = head; curr != NULL; curr = curr->next) { /* process curr */ } -> Option B
  4. Quick Check:

    Use next pointer from head for forward traversal [OK]
Hint: Use next pointer from head for forward traversal [OK]
Common Mistakes:
  • Using prev pointer in singly linked list
  • Starting from tail in singly linked list
  • Using incorrect loop conditions
3. What will be the output of the following code snippet that traverses a doubly linked list backward?
typedef struct Node {
  int data;
  struct Node* next;
  struct Node* prev;
} Node;

void printBackward(Node* tail) {
  Node* curr = tail;
  while(curr != NULL) {
    printf("%d ", curr->data);
    curr = curr->prev;
  }
}

// List: 1 <-> 2 <-> 3, tail points to node with data 3
printBackward(tail);
medium
A. 1 2 3
B. 3 1 2
C. 3 2 1
D. 2 3 1

Solution

  1. Step 1: Understand backward traversal in doubly linked list

    Starting from tail (3), moving prev pointer visits nodes 3, 2, then 1.
  2. Step 2: Trace the output

    Prints 3, then 2, then 1 with spaces.
  3. Final Answer:

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

    Backward traversal prints tail to head [OK]
Hint: Backward traversal prints from tail to head [OK]
Common Mistakes:
  • Confusing order of printing
  • Using next pointer instead of prev
  • Starting from head instead of tail
4. Identify the error in the following code that attempts to traverse a doubly linked list backward:
void traverseBackward(Node* tail) {
  Node* curr = tail;
  while(curr->next != NULL) {
    printf("%d ", curr->data);
    curr = curr->prev;
  }
}
medium
A. The printf statement is missing a newline character
B. The pointer curr should start from head, not tail
C. The code should use curr = curr->next instead of curr = curr->prev
D. The loop condition should check curr != NULL, not curr->next != NULL

Solution

  1. Step 1: Analyze loop condition for backward traversal

    Backward traversal moves using prev pointer until curr becomes NULL.
  2. Step 2: Identify incorrect condition

    Checking curr->next != NULL is wrong; it should be curr != NULL to avoid null pointer access.
  3. Final Answer:

    The loop condition should check curr != NULL, not curr->next != NULL -> Option D
  4. Quick Check:

    Loop until curr is NULL in backward traversal [OK]
Hint: Check curr != NULL in loops, not curr->next for backward traversal [OK]
Common Mistakes:
  • Using next pointer condition in backward traversal
  • Starting from head instead of tail
  • Ignoring null pointer checks
5. Given a doubly linked list with nodes containing integers, write a function to print the list forward and then backward without using extra space. Which approach correctly achieves this?
hard
A. Traverse from head to tail printing data, then traverse from tail to head printing data
B. Traverse from head to tail printing data twice
C. Traverse from tail to head printing data, then traverse from head to tail printing data
D. Traverse from head to tail printing data, then reverse the list and print forward again

Solution

  1. Step 1: Understand traversal without extra space

    Use existing next and prev pointers to traverse forward and backward.
  2. Step 2: Identify correct approach

    Traverse from head to tail printing data, then traverse from tail to head printing data correctly traverses forward from head to tail, then backward from tail to head printing data without modifying list.
  3. Final Answer:

    Traverse from head to tail printing data, then traverse from tail to head printing data -> Option A
  4. Quick Check:

    Use head and tail pointers for forward and backward traversal [OK]
Hint: Print forward from head, backward from tail without changing list [OK]
Common Mistakes:
  • Reversing list unnecessarily
  • Printing forward twice
  • Using extra space like arrays or stacks
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