Bird
Raised Fist0
DSA C#programming~5 mins

Stack Implementation Using Linked List in DSA C# - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Stack Implementation Using Linked List
O(1)
Understanding Time Complexity

We want to understand how fast the main operations of a stack work when it is built using a linked list.

Specifically, we ask: how does the time to add or remove items grow as the stack gets bigger?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


public class Node {
    public int Data;
    public Node Next;
    public Node(int data) { Data = data; Next = null; }
}

public class Stack {
    private Node top;

    public void Push(int data) {
        Node newNode = new Node(data);
        newNode.Next = top;
        top = newNode;
    }

    public int Pop() {
        if (top == null) throw new InvalidOperationException("Stack is empty");
        int value = top.Data;
        top = top.Next;
        return value;
    }
}
    

This code adds (Push) and removes (Pop) items at the top of a linked list to behave like a stack.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: Adding or removing one node at the top of the linked list.
  • How many times: Each Push or Pop does this once, no loops or recursion inside these methods.
How Execution Grows With Input

Each Push or Pop does a fixed number of steps regardless of how many items are in the stack.

Input Size (n)Approx. Operations
105 steps (create node, link, update top)
1005 steps (same fixed steps)
10005 steps (still the same fixed steps)

Pattern observation: The number of steps stays the same no matter how big the stack is.

Final Time Complexity

Time Complexity: O(1)

This means adding or removing an item takes the same short time no matter how many items are in the stack.

Common Mistake

[X] Wrong: "Since the stack can grow, Push or Pop must take longer as it gets bigger."

[OK] Correct: Each operation only changes the top node, so it does not need to look through the whole stack.

Interview Connect

Knowing that stack operations are fast and constant time helps you explain why stacks are useful in many programs and algorithms.

Self-Check

"What if we changed the stack to add items at the bottom instead of the top? How would the time complexity change?"

Practice

(1/5)
1. What is the main advantage of implementing a stack using a linked list instead of an array?
easy
A. It uses less memory than an array
B. The stack can grow dynamically without a fixed size limit
C. It allows random access to elements
D. It automatically sorts the elements

Solution

  1. Step 1: Understand stack size limitation in arrays

    Arrays have a fixed size, so stacks implemented with arrays have a maximum capacity.
  2. Step 2: Linked list dynamic size

    Linked lists can grow or shrink dynamically by adding or removing nodes, so the stack size is limited only by memory.
  3. Final Answer:

    The stack can grow dynamically without a fixed size limit -> Option B
  4. Quick Check:

    Linked list stacks grow dynamically [OK]
Hint: Linked list stacks grow dynamically, arrays do not [OK]
Common Mistakes:
  • Thinking linked list uses less memory always
  • Assuming linked list allows random access
  • Confusing stack sorting with implementation
2. Which of the following is the correct way to push an element onto a stack implemented using a linked list in C#?
easy
A. Create a new node, set its next to current top, then update top to new node
B. Create a new node, set its previous to current top, then update top to new node
C. Add the new element at the end of the linked list
D. Replace the top node's value with the new element

Solution

  1. Step 1: Understand push operation in linked list stack

    Push adds a new node at the beginning (top) of the linked list.
  2. Step 2: Correct pointer update

    The new node's next points to the current top, then top is updated to new node.
  3. Final Answer:

    Create a new node, set its next to current top, then update top to new node -> Option A
  4. Quick Check:

    Push adds node at front [OK]
Hint: Push adds node at front, update top pointer [OK]
Common Mistakes:
  • Using previous pointer instead of next
  • Adding node at end instead of front
  • Overwriting top node value instead of adding new node
3. What will be the output after the following C# code executes?
StackNode top = null;
// Push 10
StackNode node1 = new StackNode(10);
node1.next = top;
top = node1;
// Push 20
StackNode node2 = new StackNode(20);
node2.next = top;
top = node2;
// Pop
int popped = top.data;
top = top.next;
// Print top data
Console.WriteLine(top.data);
medium
A. NullReferenceException
B. 20
C. 10
D. 0

Solution

  1. Step 1: Trace push operations

    Push 10: top points to node with data 10.
    Push 20: top points to node with data 20, next points to node 10.
  2. Step 2: Trace pop operation

    Pop removes top node (20), top updated to next node (10).
  3. Step 3: Print top data

    Top now points to node with data 10, so output is 10.
  4. Final Answer:

    10 -> Option C
  5. Quick Check:

    After pop, top data = 10 [OK]
Hint: Pop removes top, next node becomes new top [OK]
Common Mistakes:
  • Printing popped value instead of new top
  • Confusing push order
  • Not updating top after pop
4. Identify the error in this pop method for a stack implemented using a linked list:
public int Pop() {
    if (top == null) {
        Console.WriteLine("Stack Underflow");
    }
    int value = top.data;
    top = top.next;
    return value;
}
medium
A. It does not return a value when stack is empty
B. It does not update the top pointer
C. It incorrectly prints "Stack Overflow" instead of "Underflow"
D. It removes the bottom node instead of the top

Solution

  1. Step 1: Check behavior when stack is empty

    If top is null, method prints message but continues to access top.data causing error or returns no value.
  2. Step 2: Missing return for empty stack case

    Method should return or throw exception when stack is empty to avoid runtime error.
  3. Final Answer:

    It does not return a value when stack is empty -> Option A
  4. Quick Check:

    Empty stack must return or throw [OK]
Hint: Always return or throw on empty stack pop [OK]
Common Mistakes:
  • Ignoring empty stack case
  • Confusing overflow with underflow
  • Not updating top pointer
5. You want to implement a method ReverseStack that reverses the elements of a stack implemented using a linked list without using extra data structures. Which approach is correct?
hard
A. Use a queue to dequeue and enqueue elements to reverse order
B. Traverse the linked list and swap data values of nodes pairwise
C. Create a new linked list and push elements from old stack to new stack
D. Use recursion to pop all elements, then push them back in reverse order

Solution

  1. Step 1: Understand constraints

    No extra data structures allowed, so using recursion (call stack) is allowed but no explicit new lists or queues.
  2. Step 2: Recursion approach

    Recursively pop all elements, then insert them back at bottom to reverse order without extra storage.
  3. Step 3: Other options use extra structures

    Swapping data or using new lists or queues violates constraints or is incorrect for stack reversal.
  4. Final Answer:

    Use recursion to pop all elements, then push them back in reverse order -> Option D
  5. Quick Check:

    Recursion reverses stack without extra structures [OK]
Hint: Use recursion to reverse stack without extra data structures [OK]
Common Mistakes:
  • Using extra linked lists or queues
  • Trying to swap node data incorrectly
  • Ignoring no extra structure constraint
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