Module 3: Object References, Linked Lists and Classes
Module Overview
In this module, you'll dive deep into object references, linked lists, and classes. These concepts are fundamental to understanding data structures and object-oriented programming in JavaScript.
Module Objectives
- Understand object references and how they differ from primitive values
- Learn about memory management and object mutation in JavaScript
- Implement linked list data structures using object references
- Create and extend JavaScript classes for data structure implementations
- Practice traversing, manipulating, and optimizing linked data structures
- Apply object-oriented programming concepts to solve complex problems
Module Content
1. Object References
This video explores how objects are stored and referenced in JavaScript, which is fundamental to understanding more complex data structures.
Key Concepts:
- Primitive vs. reference types in JavaScript
- How objects are stored in memory
- Understanding shallow vs. deep copying
- Object mutation and its implications
Code Example:
// Primitive types are copied by value let a = 5; let b = a; // b gets a copy of the value a = 10; // Changing a doesn't affect b console.log(b); // Still 5 // Objects are copied by reference let obj1 = { name: 'Alice', age: 30 }; let obj2 = obj1; // obj2 references the same object as obj1 obj1.age = 31; // Mutating obj1 also changes obj2 console.log(obj2.age); // 31 // Shallow copying let original = { name: 'Bob', profile: { job: 'Developer' } }; let shallowCopy = { ...original }; // Spread operator creates a shallow copy // Deep copying let deepCopy = JSON.parse(JSON.stringify(original)); // Simple deep copy method // But be careful, this doesn't work for functions, dates, etc.
2. Linked Lists - Part 1: Concepts and Structure
This video introduces linked lists, explaining their structure, advantages, and use cases compared to arrays.
Key Concepts:
- Basic structure of singly linked lists
- Nodes and references
- Head, tail, and traversal
- Advantages and disadvantages compared to arrays
Code Example - Node Structure:
// Basic node structure for a singly linked list class Node { constructor(value) { this.value = value; // The data stored in this node this.next = null; // Reference to the next node } } // Example of creating and linking nodes manually const node1 = new Node(10); const node2 = new Node(20); const node3 = new Node(30); // Link the nodes together node1.next = node2; node2.next = node3; // Traverse the linked list let current = node1; while (current !== null) { console.log(current.value); current = current.next; } // Output: 10, 20, 30
2. Linked Lists - Part 2: Implementation
In this video, you'll learn how to implement a linked list in JavaScript using classes, with various operations for manipulating the list.
Operations Covered:
- Inserting nodes (at head, tail, or specific position)
- Removing nodes
- Searching for values
- Traversing the list
- Handling edge cases
Code Example - Linked List Implementation:
class LinkedList { constructor() { this.head = null; this.tail = null; this.length = 0; } // Add to the end of the list append(value) { const newNode = new Node(value); if (!this.head) { this.head = newNode; this.tail = newNode; } else { this.tail.next = newNode; this.tail = newNode; } this.length++; return this; } // Add to the beginning of the list prepend(value) { const newNode = new Node(value); if (!this.head) { this.head = newNode; this.tail = newNode; } else { newNode.next = this.head; this.head = newNode; } this.length++; return this; } // Find a node by its value find(value) { if (!this.head) return null; let current = this.head; while (current) { if (current.value === value) { return current; } current = current.next; } return null; } } // Usage example const list = new LinkedList(); list.append(10).append(20).append(30); console.log(list.find(20)); // Node with value 20
3. Classes in JavaScript
This video explores the ES6 class syntax in JavaScript and how to use it for creating reusable object templates.
Key Concepts:
- Class declarations and expressions
- Constructor methods
- Instance methods and properties
- Static methods and properties
- Inheritance with extends
- super keyword
Code Example - Class Implementation:
// Basic class declaration class Vehicle { constructor(make, model, year) { this.make = make; this.model = model; this.year = year; this.isRunning = false; } // Instance method start() { this.isRunning = true; return `The ${this.make} ${this.model} is now running.`; } stop() { this.isRunning = false; return `The ${this.make} ${this.model} is now stopped.`; } // Static method (called on the class itself, not instances) static isVehicle(obj) { return obj instanceof Vehicle; } } // Inheritance class Car extends Vehicle { constructor(make, model, year, numDoors) { // Call parent constructor super(make, model, year); this.numDoors = numDoors; } // Override parent method start() { const message = super.start(); // Call parent method return `${message} All ${this.numDoors} doors are locked.`; } } // Usage const myCar = new Car('Toyota', 'Camry', 2022, 4); console.log(myCar.start()); // Output: "The Toyota Camry is now running. All 4 doors are locked."
4. Implementing Data Structures with Classes
In this final video, you'll learn how to use classes to implement various data structures beyond linked lists.
Data Structures Covered:
- Stacks
- Queues
- Binary Trees
- Hash Tables
Code Example - Stack Implementation:
class Stack { constructor() { this.items = []; } // Add an element to the top of the stack push(element) { this.items.push(element); } // Remove and return the top element pop() { if (this.isEmpty()) { return "Underflow - Stack is empty"; } return this.items.pop(); } // Look at the top element without removing it peek() { if (this.isEmpty()) { return "Stack is empty"; } return this.items[this.items.length - 1]; } // Check if the stack is empty isEmpty() { return this.items.length === 0; } // Return the size of the stack size() { return this.items.length; } // Clear the stack clear() { this.items = []; } } // Usage example const stack = new Stack(); stack.push(10); stack.push(20); stack.push(30); console.log(stack.peek()); // 30 console.log(stack.pop()); // 30 console.log(stack.size()); // 2
5. Guided Project
Complete the Module 3 Guided Project to practice implementing and working with linked lists and classes.
Project Focus:
- Building a doubly linked list
- Creating a class hierarchy for different data structures
- Implementing advanced operations (sorting, reversing, etc.)
- Testing and debugging your implementations
6. Practice Activities
- Module 3 Practice Exercises
- Check for Understanding Quiz
- Practice GCA Test
Instead of using CodeSignal Arcade which is no longer available, we recommend the following LeetCode collections that focus on linked lists and object-oriented programming: