Bird
Raised Fist0
DSA Rustprogramming~20 mins

Adjacency List Representation in DSA Rust - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Adjacency List Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of adjacency list after adding edges
What is the printed adjacency list after running this Rust code that adds edges to a graph represented by adjacency lists?
DSA Rust
use std::collections::HashMap;

fn main() {
    let mut graph: HashMap<i32, Vec<i32>> = HashMap::new();
    graph.entry(1).or_insert(Vec::new()).push(2);
    graph.entry(1).or_insert(Vec::new()).push(3);
    graph.entry(2).or_insert(Vec::new()).push(4);
    graph.entry(3).or_insert(Vec::new()).push(4);
    for (node, edges) in &graph {
        print!("{} -> ", node);
        for e in edges {
            print!("{} -> ", e);
        }
        println!("null");
    }
}
A
1 -&gt; 3 -&gt; 2 -&gt; null
2 -&gt; 4 -&gt; null
3 -&gt; 4 -&gt; null
B
1 -&gt; 2 -&gt; 3 -&gt; null
2 -&gt; 4 -&gt; null
3 -&gt; 4 -&gt; null
C
1 -&gt; 2 -&gt; null
2 -&gt; 4 -&gt; null
3 -&gt; 4 -&gt; null
D
1 -&gt; 2 -&gt; 3 -&gt; 4 -&gt; null
2 -&gt; null
3 -&gt; null
Attempts:
2 left
💡 Hint
Look carefully at the order edges are added to each node's list.
🧠 Conceptual
intermediate
1:30remaining
Number of edges in adjacency list
Given an undirected graph represented by this adjacency list, how many edges does the graph have?
DSA Rust
let graph = vec![
    (1, vec![2, 3]),
    (2, vec![1, 4]),
    (3, vec![1]),
    (4, vec![2])
];
A4
B6
C5
D3
Attempts:
2 left
💡 Hint
Remember each edge appears twice in an undirected adjacency list.
🔧 Debug
advanced
1:30remaining
Identify the error in adjacency list insertion
What error will this Rust code produce when trying to add an edge to the adjacency list?
DSA Rust
use std::collections::HashMap;

fn main() {
    let mut graph: HashMap<i32, Vec<i32>> = HashMap::new();
    graph.get_mut(&1).unwrap().push(2);
}
Apanic at 'called `Option::unwrap()` on a `None` value'
BSyntaxError: missing semicolon
CTypeError: cannot borrow immutable reference as mutable
DNo error, runs successfully
Attempts:
2 left
💡 Hint
Check if the key 1 exists before calling unwrap.
❓ Predict Output
advanced
2:00remaining
Output after removing an edge from adjacency list
What is the adjacency list printed after removing edge 3 from node 1 in this Rust code?
DSA Rust
use std::collections::HashMap;

fn main() {
    let mut graph: HashMap<i32, Vec<i32>> = HashMap::new();
    graph.entry(1).or_insert(Vec::new()).extend(vec![2, 3, 4]);
    graph.entry(2).or_insert(Vec::new()).push(1);

    if let Some(edges) = graph.get_mut(&1) {
        edges.retain(|&x| x != 3);
    }

    for (node, edges) in &graph {
        print!("{} -> ", node);
        for e in edges {
            print!("{} -> ", e);
        }
        println!("null");
    }
}
A
1 -&gt; 3 -&gt; 4 -&gt; null
2 -&gt; 1 -&gt; null
B
1 -&gt; 2 -&gt; null
2 -&gt; 1 -&gt; null
C
1 -&gt; 2 -&gt; 4 -&gt; null
2 -&gt; 1 -&gt; null
D
1 -&gt; 2 -&gt; 3 -&gt; 4 -&gt; null
2 -&gt; 1 -&gt; null
Attempts:
2 left
💡 Hint
The retain method keeps elements that do not equal 3.
🧠 Conceptual
expert
1:30remaining
Memory complexity of adjacency list vs adjacency matrix
Which statement correctly compares the memory usage of adjacency list and adjacency matrix for a graph with V vertices and E edges?
AAdjacency list uses O(V + E) memory, adjacency matrix uses O(V^2) memory
BAdjacency list uses O(V^2) memory, adjacency matrix uses O(V + E) memory
CBoth adjacency list and adjacency matrix use O(V + E) memory
DBoth adjacency list and adjacency matrix use O(V^2) memory
Attempts:
2 left
💡 Hint
Think about how edges are stored in each representation.

Practice

(1/5)
1. What does an adjacency list represent in graph data structures?
easy
A. A list of all nodes without connections
B. A matrix showing distances between nodes
C. A list where each node stores its connected neighbors
D. A queue of nodes to visit next

Solution

  1. Step 1: Understand graph representation

    An adjacency list stores each node with a list of its neighbors, showing direct connections.
  2. Step 2: Compare options

    Only A list where each node stores its connected neighbors describes this correctly; others describe different structures or concepts.
  3. Final Answer:

    A list where each node stores its connected neighbors -> Option C
  4. Quick Check:

    Adjacency list = neighbors list [OK]
Hint: Adjacency list = node with its neighbors [OK]
Common Mistakes:
  • Confusing adjacency list with adjacency matrix
  • Thinking adjacency list stores distances
  • Mixing up with traversal queues
2. Which Rust data structure is best suited to represent an adjacency list for a graph with nodes labeled 0 to n-1?
easy
A. Vec
B. HashMap
C. Vec<usize>
D. HashSet<usize>

Solution

  1. Step 1: Identify adjacency list structure

    An adjacency list for nodes 0 to n-1 is a vector where each index holds a vector of neighbors.
  2. Step 2: Match Rust types

    Vec matches this: outer Vec for nodes, inner Vec for neighbors. Others don't store neighbors per node properly.
  3. Final Answer:

    Vec -> Option A
  4. Quick Check:

    Vec of Vecs = adjacency list [OK]
Hint: Use Vec for adjacency list in Rust [OK]
Common Mistakes:
  • Using HashMap with single usize value instead of list
  • Using Vec<usize> which holds only one neighbor list
  • Using HashSet which doesn't map nodes to neighbors
3. Given the following Rust code, what is the printed adjacency list?
let mut graph: Vec = vec![vec![], vec![], vec![]];
graph[0].push(1);
graph[1].push(2);
graph[2].push(0);
println!("{:?}", graph);
medium
A. [[0], [1], [2]]
B. [[1], [2], [0]]
C. [[], [], []]
D. [[2], [0], [1]]

Solution

  1. Step 1: Trace graph initialization

    graph starts as three empty vectors: [[], [], []]
  2. Step 2: Apply push operations

    graph[0].push(1) -> [[1], [], []] graph[1].push(2) -> [[1], [2], []] graph[2].push(0) -> [[1], [2], [0]]
  3. Final Answer:

    [[1], [2], [0]] -> Option B
  4. Quick Check:

    Push neighbors correctly = [[1], [2], [0]] [OK]
Hint: Follow push calls step-by-step [OK]
Common Mistakes:
  • Mixing indices when pushing neighbors
  • Assuming graph is empty after pushes
  • Confusing order of neighbors
4. Identify the error in this Rust code snippet for creating an adjacency list:
let mut graph: Vec = Vec::new();
graph[0].push(1);
medium
A. Vec::new() cannot be mutable
B. usize type is incorrect for adjacency list
C. push method does not exist for Vec
D. graph is empty, so graph[0] access causes panic

Solution

  1. Step 1: Analyze graph initialization

    graph is empty Vec with no elements, so graph[0] does not exist.
  2. Step 2: Understand indexing error

    Accessing graph[0] causes runtime panic because index 0 is out of bounds.
  3. Final Answer:

    graph is empty, so graph[0] access causes panic -> Option D
  4. Quick Check:

    Empty Vec indexing = panic [OK]
Hint: Initialize Vec with size before indexing [OK]
Common Mistakes:
  • Assuming Vec::new() has elements
  • Confusing mutability with initialization
  • Thinking push is invalid method
5. You want to represent a directed graph with 4 nodes using an adjacency list in Rust. Which code correctly initializes the graph and adds edges from node 0 to 1 and 2, and from node 2 to 3?
hard
A. let mut graph = vec![vec![], vec![], vec![], vec![]]; graph[0].push(1); graph[0].push(2); graph[2].push(3);
B. let mut graph = Vec::new(); graph[0].push(1); graph[0].push(2); graph[2].push(3);
C. let mut graph = vec![0; 4]; graph[0] = 1; graph[0] = 2; graph[2] = 3;
D. let mut graph = vec![vec![0]; 4]; graph[0].push(1); graph[0].push(2); graph[2].push(3);

Solution

  1. Step 1: Check graph initialization

    let mut graph = vec![vec![], vec![], vec![], vec![]]; graph[0].push(1); graph[0].push(2); graph[2].push(3); initializes a Vec of Vecs with 4 empty vectors, ready to hold neighbors.
  2. Step 2: Verify edge additions

    graph[0].push(1) and graph[0].push(2) add edges from node 0 to 1 and 2; graph[2].push(3) adds edge from 2 to 3.
  3. Step 3: Identify errors in other options

    let mut graph = Vec::new(); graph[0].push(1); graph[0].push(2); graph[2].push(3);: graph is empty Vec, indexing causes panic. let mut graph = vec![0; 4]; graph[0] = 1; graph[0] = 2; graph[2] = 3;: graph is Vec<usize>, not Vec; push invalid. let mut graph = vec![vec![0]; 4]; graph[0].push(1); graph[0].push(2); graph[2].push(3);: graph initialized with vec![vec![0]; 4] means each node starts with neighbor 0, incorrect.
  4. Final Answer:

    let mut graph = vec![vec![], vec![], vec![], vec![]]; graph[0].push(1); graph[0].push(2); graph[2].push(3); -> Option A
  5. Quick Check:

    Vec of empty Vecs + push edges = correct [OK]
Hint: Initialize Vec with empty Vecs before pushing [OK]
Common Mistakes:
  • Using empty Vec without size causes panic
  • Initializing with repeated vec![0] adds wrong neighbors
  • Using Vec<usize> instead of Vec
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