8. ADTs and Lists Lesson

Lesson Objectives

Introduce linked lists and use them to implement the Stack ADT.

The Node Class

The Node Class

To see sample solutions, toggle "Show Solutions" above.

Sample solutions not included, because "Show Solutions" was not toggled before printing.

Four Activities

Today, we are going to work through five group activities related to your recent readings on linked lists and ADTs.

Rapid Fire Review

In your groups, answer each of the following multiple-select questions. Each person should have their own copy of the questions and solution(s) in addition to what is on your exit ticket.

  1. What is a linked list?

    1. A collection of data stored in contiguous memory locations.

    2. A sequence of objects where each object references the next.

    3. A type of array where elements are accessed randomly.

    4. A data structure that performs better in all situations than an array.

  2. What does the next instance variable in a Node object do?

    1. Stores the value of the Node.

    2. Links to the previous Node in the sequence.

    3. Links to the next Node in the linked list.

    4. Stores the index of the Node in an array.

  3. Which of the following statements best describes a primary advantage of using a linked list over an array?

    1. Linked lists are stored in contiguous memory, making access to elements faster.

    2. Linked lists are easier to search than arrays.

    3. Linked lists can grow dynamically without the need to reallocate memory.

    4. Linked lists can only store string data types.

  4. Why is a linked list considered an alternative to an array?

    1. Linked lists and arrays have identical performance characteristics.

    2. Both store collections of data but handle memory allocation and access differently.

    3. Linked lists are always faster than arrays.

    4. Arrays can only hold integer values while linked lists can hold any data type.

Code Tracing 1

In your groups, draw the memory map for the following code and then write the output for the print statements. Each person should have their own copy of the memory map in addition to the one on your exit ticket.

Listing 70 Code Tracing 1
 2public static void main(String[] args) {
 3
 4    Node node = new Node("Billy");
 5    node.setItem("Susan");
 6    node.setNext(new Node("Sally"));
 7    node.getNext().setNext(new Node("Barry"));
 8
 9    Node end = new Node("Supa Mike", node);
10    Node n = node.getNext();
11    n.setNext(new Node("Simon"));
12
13    System.out.println(node.getItem());                     // Output 1
14    System.out.println(node.getNext().getItem());           // Output 2
15    System.out.println(end.getItem());                      // Output 3
16    System.out.println(node.getNext().getNext().getItem()); // Output 4
17
18} // main
Code Tracing 1: Sample Solution

Note

The one-parameter Node constructor uses this(item, null); to call the two-parameter constructor. Both constructor calls initialize the same object. This is why <init> (the name used for constructors in the trace) appears twice for that object when stepping through its construction; a second object is not created.

Step 1 of 14: Driver.java:4
Listing 71 Code visualization for Code Tracing 1.
 4Node node = new Node("Billy");
 5node.setItem("Susan");
 6node.setNext(new Node("Sally"));
 7node.getNext().setNext(new Node("Barry"));
 8
 9Node end = new Node("Supa Mike", node);
10Node n = node.getNext();
11n.setNext(new Node("Simon"));
12
13System.out.println(node.getItem());                     // Output 1
14System.out.println(node.getNext().getItem());           // Output 2
15System.out.println(end.getItem());                      // Output 3
16System.out.println(node.getNext().getNext().getItem()); // Output 4
17
18System.out.println(node.getNext().getNext().getNext()); // Output 5 (what!?)
19
20String lastItem = node.getNext().getNext().getNext().getItem();
21System.out.println(lastItem);                           // Output 6 (reachable?)

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node node = new Node("Billy");
 5        node.setItem("Susan");
 6        node.setNext(new Node("Sally"));
 7        node.getNext().setNext(new Node("Barry"));
 8
 9        Node end = new Node("Supa Mike", node);
10        Node n = node.getNext();
11        n.setNext(new Node("Simon"));
12
13        System.out.println(node.getItem());                     // Output 1
14        System.out.println(node.getNext().getItem());           // Output 2
15        System.out.println(end.getItem());                      // Output 3
16        System.out.println(node.getNext().getNext().getItem()); // Output 4
17
18        System.out.println(node.getNext().getNext().getNext()); // Output 5 (what!?)
19
20        String lastItem = node.getNext().getNext().getNext().getItem();
21        System.out.println(lastItem);                           // Output 6 (reachable?)
22    } // main
23
24} // Driver
Java program memory state. 1 stack frame; 0 heap objects.Stack frame: main:4 No visible entries.{"summary":"Java program memory state. 1 stack frame; 0 heap objects.","sections":[{"heading":"Stack frame: main:4","items":[]}]}main:4

Code visualization for Code Tracing 1. Note: The debugger breakpoint is on line 4 in Driver.java. [code listing] [download] [open]

> (no output yet)

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node node = new Node("Billy");
 5        node.setItem("Susan");
 6        node.setNext(new Node("Sally"));
 7        node.getNext().setNext(new Node("Barry"));
 8
 9        Node end = new Node("Supa Mike", node);
10        Node n = node.getNext();
11        n.setNext(new Node("Simon"));
12
13        System.out.println(node.getItem());                     // Output 1
14        System.out.println(node.getNext().getItem());           // Output 2
15        System.out.println(end.getItem());                      // Output 3
16        System.out.println(node.getNext().getNext().getItem()); // Output 4
17
18        System.out.println(node.getNext().getNext().getNext()); // Output 5 (what!?)
19
20        String lastItem = node.getNext().getNext().getNext().getItem();
21        System.out.println(lastItem);                           // Output 6 (reachable?)
22    } // main
23
24} // Driver
Java program memory state. 1 stack frame; 1 heap object.Stack frame: main:5 Node node: reference to object 1272 Heap object 1272: Node@1272 String item: reference to object 1273, "Billy" Node next: null{"summary":"Java program memory state. 1 stack frame; 1 heap object.","sections":[{"heading":"Stack frame: main:5","items":["Node node: reference to object 1272"]},{"heading":"Heap object 1272: Node@1272","items":["String item: reference to object 1273, \"Billy\"","Node next: null"]}]}main:5Nodenode1272Node@1272Stringitem1273"Billy"Nodenextnull

Code visualization for Code Tracing 1. Note: The debugger breakpoint is on line 5 in Driver.java. [code listing] [download] [open]

> (no output yet)

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node node = new Node("Billy");
 5        node.setItem("Susan");
 6        node.setNext(new Node("Sally"));
 7        node.getNext().setNext(new Node("Barry"));
 8
 9        Node end = new Node("Supa Mike", node);
10        Node n = node.getNext();
11        n.setNext(new Node("Simon"));
12
13        System.out.println(node.getItem());                     // Output 1
14        System.out.println(node.getNext().getItem());           // Output 2
15        System.out.println(end.getItem());                      // Output 3
16        System.out.println(node.getNext().getNext().getItem()); // Output 4
17
18        System.out.println(node.getNext().getNext().getNext()); // Output 5 (what!?)
19
20        String lastItem = node.getNext().getNext().getNext().getItem();
21        System.out.println(lastItem);                           // Output 6 (reachable?)
22    } // main
23
24} // Driver
Java program memory state. 1 stack frame; 1 heap object.Stack frame: main:6 Node node: reference to object 1272 Heap object 1272: Node@1272 String item: reference to object 904, "Susan" Node next: null{"summary":"Java program memory state. 1 stack frame; 1 heap object.","sections":[{"heading":"Stack frame: main:6","items":["Node node: reference to object 1272"]},{"heading":"Heap object 1272: Node@1272","items":["String item: reference to object 904, \"Susan\"","Node next: null"]}]}main:6Nodenode1272Node@1272Stringitem904"Susan"Nodenextnull

Code visualization for Code Tracing 1. Note: The debugger breakpoint is on line 6 in Driver.java. [code listing] [download] [open]

> (no output yet)

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node node = new Node("Billy");
 5        node.setItem("Susan");
 6        node.setNext(new Node("Sally"));
 7        node.getNext().setNext(new Node("Barry"));
 8
 9        Node end = new Node("Supa Mike", node);
10        Node n = node.getNext();
11        n.setNext(new Node("Simon"));
12
13        System.out.println(node.getItem());                     // Output 1
14        System.out.println(node.getNext().getItem());           // Output 2
15        System.out.println(end.getItem());                      // Output 3
16        System.out.println(node.getNext().getNext().getItem()); // Output 4
17
18        System.out.println(node.getNext().getNext().getNext()); // Output 5 (what!?)
19
20        String lastItem = node.getNext().getNext().getNext().getItem();
21        System.out.println(lastItem);                           // Output 6 (reachable?)
22    } // main
23
24} // Driver
Java program memory state. 1 stack frame; 2 heap objects.Stack frame: main:7 Node node: reference to object 1272 Heap object 1272: Node@1272 String item: reference to object 904, "Susan" Node next: reference to object 1275 Heap object 1275: Node@1275 String item: reference to object 1276, "Sally" Node next: null{"summary":"Java program memory state. 1 stack frame; 2 heap objects.","sections":[{"heading":"Stack frame: main:7","items":["Node node: reference to object 1272"]},{"heading":"Heap object 1272: Node@1272","items":["String item: reference to object 904, \"Susan\"","Node next: reference to object 1275"]},{"heading":"Heap object 1275: Node@1275","items":["String item: reference to object 1276, \"Sally\"","Node next: null"]}]}main:7Nodenode1272Node@1272Stringitem904"Susan"Nodenext1275Node@1275Stringitem1276"Sally"Nodenextnull

Code visualization for Code Tracing 1. Note: The debugger breakpoint is on line 7 in Driver.java. [code listing] [download] [open]

> (no output yet)

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node node = new Node("Billy");
 5        node.setItem("Susan");
 6        node.setNext(new Node("Sally"));
 7        node.getNext().setNext(new Node("Barry"));
 8
 9        Node end = new Node("Supa Mike", node);
10        Node n = node.getNext();
11        n.setNext(new Node("Simon"));
12
13        System.out.println(node.getItem());                     // Output 1
14        System.out.println(node.getNext().getItem());           // Output 2
15        System.out.println(end.getItem());                      // Output 3
16        System.out.println(node.getNext().getNext().getItem()); // Output 4
17
18        System.out.println(node.getNext().getNext().getNext()); // Output 5 (what!?)
19
20        String lastItem = node.getNext().getNext().getNext().getItem();
21        System.out.println(lastItem);                           // Output 6 (reachable?)
22    } // main
23
24} // Driver
Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:9 Node node: reference to object 1272 Heap object 1272: Node@1272 String item: reference to object 904, "Susan" Node next: reference to object 1275 Heap object 1275: Node@1275 String item: reference to object 1276, "Sally" Node next: reference to object 1278 Heap object 1278: Node@1278 String item: reference to object 1279, "Barry" Node next: null{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:9","items":["Node node: reference to object 1272"]},{"heading":"Heap object 1272: Node@1272","items":["String item: reference to object 904, \"Susan\"","Node next: reference to object 1275"]},{"heading":"Heap object 1275: Node@1275","items":["String item: reference to object 1276, \"Sally\"","Node next: reference to object 1278"]},{"heading":"Heap object 1278: Node@1278","items":["String item: reference to object 1279, \"Barry\"","Node next: null"]}]}main:9Nodenode1272Node@1272Stringitem904"Susan"Nodenext1275Node@1275Stringitem1276"Sally"Nodenext1278Node@1278Stringitem1279"Barry"Nodenextnull

Code visualization for Code Tracing 1. Note: The debugger breakpoint is on line 9 in Driver.java. [code listing] [download] [open]

> (no output yet)

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node node = new Node("Billy");
 5        node.setItem("Susan");
 6        node.setNext(new Node("Sally"));
 7        node.getNext().setNext(new Node("Barry"));
 8
 9        Node end = new Node("Supa Mike", node);
10        Node n = node.getNext();
11        n.setNext(new Node("Simon"));
12
13        System.out.println(node.getItem());                     // Output 1
14        System.out.println(node.getNext().getItem());           // Output 2
15        System.out.println(end.getItem());                      // Output 3
16        System.out.println(node.getNext().getNext().getItem()); // Output 4
17
18        System.out.println(node.getNext().getNext().getNext()); // Output 5 (what!?)
19
20        String lastItem = node.getNext().getNext().getNext().getItem();
21        System.out.println(lastItem);                           // Output 6 (reachable?)
22    } // main
23
24} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:10 Node node: reference to object 1272 Node end: reference to object 1281 Heap object 1272: Node@1272 String item: reference to object 904, "Susan" Node next: reference to object 1275 Heap object 1275: Node@1275 String item: reference to object 1276, "Sally" Node next: reference to object 1278 Heap object 1278: Node@1278 String item: reference to object 1279, "Barry" Node next: null Heap object 1281: Node@1281 String item: reference to object 1282, "Supa Mike" Node next: reference to object 1272{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:10","items":["Node node: reference to object 1272","Node end: reference to object 1281"]},{"heading":"Heap object 1272: Node@1272","items":["String item: reference to object 904, \"Susan\"","Node next: reference to object 1275"]},{"heading":"Heap object 1275: Node@1275","items":["String item: reference to object 1276, \"Sally\"","Node next: reference to object 1278"]},{"heading":"Heap object 1278: Node@1278","items":["String item: reference to object 1279, \"Barry\"","Node next: null"]},{"heading":"Heap object 1281: Node@1281","items":["String item: reference to object 1282, \"Supa Mike\"","Node next: reference to object 1272"]}]}main:10Nodenode1272Nodeend1281Node@1272Stringitem904"Susan"Nodenext1275Node@1275Stringitem1276"Sally"Nodenext1278Node@1278Stringitem1279"Barry"NodenextnullNode@1281Stringitem1282"Supa Mike"Nodenext1272

Code visualization for Code Tracing 1. Note: The debugger breakpoint is on line 10 in Driver.java. [code listing] [download] [open]

> (no output yet)

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node node = new Node("Billy");
 5        node.setItem("Susan");
 6        node.setNext(new Node("Sally"));
 7        node.getNext().setNext(new Node("Barry"));
 8
 9        Node end = new Node("Supa Mike", node);
10        Node n = node.getNext();
11        n.setNext(new Node("Simon"));
12
13        System.out.println(node.getItem());                     // Output 1
14        System.out.println(node.getNext().getItem());           // Output 2
15        System.out.println(end.getItem());                      // Output 3
16        System.out.println(node.getNext().getNext().getItem()); // Output 4
17
18        System.out.println(node.getNext().getNext().getNext()); // Output 5 (what!?)
19
20        String lastItem = node.getNext().getNext().getNext().getItem();
21        System.out.println(lastItem);                           // Output 6 (reachable?)
22    } // main
23
24} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:11 Node node: reference to object 1272 Node end: reference to object 1281 Node n: reference to object 1275 Heap object 1272: Node@1272 String item: reference to object 904, "Susan" Node next: reference to object 1275 Heap object 1275: Node@1275 String item: reference to object 1276, "Sally" Node next: reference to object 1278 Heap object 1278: Node@1278 String item: reference to object 1279, "Barry" Node next: null Heap object 1281: Node@1281 String item: reference to object 1282, "Supa Mike" Node next: reference to object 1272{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:11","items":["Node node: reference to object 1272","Node end: reference to object 1281","Node n: reference to object 1275"]},{"heading":"Heap object 1272: Node@1272","items":["String item: reference to object 904, \"Susan\"","Node next: reference to object 1275"]},{"heading":"Heap object 1275: Node@1275","items":["String item: reference to object 1276, \"Sally\"","Node next: reference to object 1278"]},{"heading":"Heap object 1278: Node@1278","items":["String item: reference to object 1279, \"Barry\"","Node next: null"]},{"heading":"Heap object 1281: Node@1281","items":["String item: reference to object 1282, \"Supa Mike\"","Node next: reference to object 1272"]}]}main:11Nodenode1272Nodeend1281Noden1275Node@1272Stringitem904"Susan"Nodenext1275Node@1275Stringitem1276"Sally"Nodenext1278Node@1278Stringitem1279"Barry"NodenextnullNode@1281Stringitem1282"Supa Mike"Nodenext1272

Code visualization for Code Tracing 1. Note: The debugger breakpoint is on line 11 in Driver.java. [code listing] [download] [open]

> (no output yet)

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node node = new Node("Billy");
 5        node.setItem("Susan");
 6        node.setNext(new Node("Sally"));
 7        node.getNext().setNext(new Node("Barry"));
 8
 9        Node end = new Node("Supa Mike", node);
10        Node n = node.getNext();
11        n.setNext(new Node("Simon"));
12
13        System.out.println(node.getItem());                     // Output 1
14        System.out.println(node.getNext().getItem());           // Output 2
15        System.out.println(end.getItem());                      // Output 3
16        System.out.println(node.getNext().getNext().getItem()); // Output 4
17
18        System.out.println(node.getNext().getNext().getNext()); // Output 5 (what!?)
19
20        String lastItem = node.getNext().getNext().getNext().getItem();
21        System.out.println(lastItem);                           // Output 6 (reachable?)
22    } // main
23
24} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:13 Node node: reference to object 1272 Node end: reference to object 1281 Node n: reference to object 1275 Heap object 1272: Node@1272 String item: reference to object 904, "Susan" Node next: reference to object 1275 Heap object 1275: Node@1275 String item: reference to object 1276, "Sally" Node next: reference to object 1284 Heap object 1284: Node@1284 String item: reference to object 1285, "Simon" Node next: null Heap object 1281: Node@1281 String item: reference to object 1282, "Supa Mike" Node next: reference to object 1272{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:13","items":["Node node: reference to object 1272","Node end: reference to object 1281","Node n: reference to object 1275"]},{"heading":"Heap object 1272: Node@1272","items":["String item: reference to object 904, \"Susan\"","Node next: reference to object 1275"]},{"heading":"Heap object 1275: Node@1275","items":["String item: reference to object 1276, \"Sally\"","Node next: reference to object 1284"]},{"heading":"Heap object 1284: Node@1284","items":["String item: reference to object 1285, \"Simon\"","Node next: null"]},{"heading":"Heap object 1281: Node@1281","items":["String item: reference to object 1282, \"Supa Mike\"","Node next: reference to object 1272"]}]}main:13Nodenode1272Nodeend1281Noden1275Node@1272Stringitem904"Susan"Nodenext1275Node@1275Stringitem1276"Sally"Nodenext1284Node@1284Stringitem1285"Simon"NodenextnullNode@1281Stringitem1282"Supa Mike"Nodenext1272

Code visualization for Code Tracing 1. Note: The debugger breakpoint is on line 13 in Driver.java. [code listing] [download] [open]

> (no output yet)

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node node = new Node("Billy");
 5        node.setItem("Susan");
 6        node.setNext(new Node("Sally"));
 7        node.getNext().setNext(new Node("Barry"));
 8
 9        Node end = new Node("Supa Mike", node);
10        Node n = node.getNext();
11        n.setNext(new Node("Simon"));
12
13        System.out.println(node.getItem());                     // Output 1
14        System.out.println(node.getNext().getItem());           // Output 2
15        System.out.println(end.getItem());                      // Output 3
16        System.out.println(node.getNext().getNext().getItem()); // Output 4
17
18        System.out.println(node.getNext().getNext().getNext()); // Output 5 (what!?)
19
20        String lastItem = node.getNext().getNext().getNext().getItem();
21        System.out.println(lastItem);                           // Output 6 (reachable?)
22    } // main
23
24} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:14 Node node: reference to object 1272 Node end: reference to object 1281 Node n: reference to object 1275 Heap object 1272: Node@1272 String item: reference to object 904, "Susan" Node next: reference to object 1275 Heap object 1275: Node@1275 String item: reference to object 1276, "Sally" Node next: reference to object 1284 Heap object 1284: Node@1284 String item: reference to object 1285, "Simon" Node next: null Heap object 1281: Node@1281 String item: reference to object 1282, "Supa Mike" Node next: reference to object 1272{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:14","items":["Node node: reference to object 1272","Node end: reference to object 1281","Node n: reference to object 1275"]},{"heading":"Heap object 1272: Node@1272","items":["String item: reference to object 904, \"Susan\"","Node next: reference to object 1275"]},{"heading":"Heap object 1275: Node@1275","items":["String item: reference to object 1276, \"Sally\"","Node next: reference to object 1284"]},{"heading":"Heap object 1284: Node@1284","items":["String item: reference to object 1285, \"Simon\"","Node next: null"]},{"heading":"Heap object 1281: Node@1281","items":["String item: reference to object 1282, \"Supa Mike\"","Node next: reference to object 1272"]}]}main:14Nodenode1272Nodeend1281Noden1275Node@1272Stringitem904"Susan"Nodenext1275Node@1275Stringitem1276"Sally"Nodenext1284Node@1284Stringitem1285"Simon"NodenextnullNode@1281Stringitem1282"Supa Mike"Nodenext1272

Code visualization for Code Tracing 1. Note: The debugger breakpoint is on line 14 in Driver.java. [code listing] [download] [open]

Susan

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node node = new Node("Billy");
 5        node.setItem("Susan");
 6        node.setNext(new Node("Sally"));
 7        node.getNext().setNext(new Node("Barry"));
 8
 9        Node end = new Node("Supa Mike", node);
10        Node n = node.getNext();
11        n.setNext(new Node("Simon"));
12
13        System.out.println(node.getItem());                     // Output 1
14        System.out.println(node.getNext().getItem());           // Output 2
15        System.out.println(end.getItem());                      // Output 3
16        System.out.println(node.getNext().getNext().getItem()); // Output 4
17
18        System.out.println(node.getNext().getNext().getNext()); // Output 5 (what!?)
19
20        String lastItem = node.getNext().getNext().getNext().getItem();
21        System.out.println(lastItem);                           // Output 6 (reachable?)
22    } // main
23
24} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:15 Node node: reference to object 1272 Node end: reference to object 1281 Node n: reference to object 1275 Heap object 1272: Node@1272 String item: reference to object 904, "Susan" Node next: reference to object 1275 Heap object 1275: Node@1275 String item: reference to object 1276, "Sally" Node next: reference to object 1284 Heap object 1284: Node@1284 String item: reference to object 1285, "Simon" Node next: null Heap object 1281: Node@1281 String item: reference to object 1282, "Supa Mike" Node next: reference to object 1272{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:15","items":["Node node: reference to object 1272","Node end: reference to object 1281","Node n: reference to object 1275"]},{"heading":"Heap object 1272: Node@1272","items":["String item: reference to object 904, \"Susan\"","Node next: reference to object 1275"]},{"heading":"Heap object 1275: Node@1275","items":["String item: reference to object 1276, \"Sally\"","Node next: reference to object 1284"]},{"heading":"Heap object 1284: Node@1284","items":["String item: reference to object 1285, \"Simon\"","Node next: null"]},{"heading":"Heap object 1281: Node@1281","items":["String item: reference to object 1282, \"Supa Mike\"","Node next: reference to object 1272"]}]}main:15Nodenode1272Nodeend1281Noden1275Node@1272Stringitem904"Susan"Nodenext1275Node@1275Stringitem1276"Sally"Nodenext1284Node@1284Stringitem1285"Simon"NodenextnullNode@1281Stringitem1282"Supa Mike"Nodenext1272

Code visualization for Code Tracing 1. Note: The debugger breakpoint is on line 15 in Driver.java. [code listing] [download] [open]

Susan
Sally

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node node = new Node("Billy");
 5        node.setItem("Susan");
 6        node.setNext(new Node("Sally"));
 7        node.getNext().setNext(new Node("Barry"));
 8
 9        Node end = new Node("Supa Mike", node);
10        Node n = node.getNext();
11        n.setNext(new Node("Simon"));
12
13        System.out.println(node.getItem());                     // Output 1
14        System.out.println(node.getNext().getItem());           // Output 2
15        System.out.println(end.getItem());                      // Output 3
16        System.out.println(node.getNext().getNext().getItem()); // Output 4
17
18        System.out.println(node.getNext().getNext().getNext()); // Output 5 (what!?)
19
20        String lastItem = node.getNext().getNext().getNext().getItem();
21        System.out.println(lastItem);                           // Output 6 (reachable?)
22    } // main
23
24} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:16 Node node: reference to object 1272 Node end: reference to object 1281 Node n: reference to object 1275 Heap object 1272: Node@1272 String item: reference to object 904, "Susan" Node next: reference to object 1275 Heap object 1275: Node@1275 String item: reference to object 1276, "Sally" Node next: reference to object 1284 Heap object 1284: Node@1284 String item: reference to object 1285, "Simon" Node next: null Heap object 1281: Node@1281 String item: reference to object 1282, "Supa Mike" Node next: reference to object 1272{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:16","items":["Node node: reference to object 1272","Node end: reference to object 1281","Node n: reference to object 1275"]},{"heading":"Heap object 1272: Node@1272","items":["String item: reference to object 904, \"Susan\"","Node next: reference to object 1275"]},{"heading":"Heap object 1275: Node@1275","items":["String item: reference to object 1276, \"Sally\"","Node next: reference to object 1284"]},{"heading":"Heap object 1284: Node@1284","items":["String item: reference to object 1285, \"Simon\"","Node next: null"]},{"heading":"Heap object 1281: Node@1281","items":["String item: reference to object 1282, \"Supa Mike\"","Node next: reference to object 1272"]}]}main:16Nodenode1272Nodeend1281Noden1275Node@1272Stringitem904"Susan"Nodenext1275Node@1275Stringitem1276"Sally"Nodenext1284Node@1284Stringitem1285"Simon"NodenextnullNode@1281Stringitem1282"Supa Mike"Nodenext1272

Code visualization for Code Tracing 1. Note: The debugger breakpoint is on line 16 in Driver.java. [code listing] [download] [open]

Susan
Sally
Supa Mike

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node node = new Node("Billy");
 5        node.setItem("Susan");
 6        node.setNext(new Node("Sally"));
 7        node.getNext().setNext(new Node("Barry"));
 8
 9        Node end = new Node("Supa Mike", node);
10        Node n = node.getNext();
11        n.setNext(new Node("Simon"));
12
13        System.out.println(node.getItem());                     // Output 1
14        System.out.println(node.getNext().getItem());           // Output 2
15        System.out.println(end.getItem());                      // Output 3
16        System.out.println(node.getNext().getNext().getItem()); // Output 4
17
18        System.out.println(node.getNext().getNext().getNext()); // Output 5 (what!?)
19
20        String lastItem = node.getNext().getNext().getNext().getItem();
21        System.out.println(lastItem);                           // Output 6 (reachable?)
22    } // main
23
24} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:18 Node node: reference to object 1272 Node end: reference to object 1281 Node n: reference to object 1275 Heap object 1272: Node@1272 String item: reference to object 904, "Susan" Node next: reference to object 1275 Heap object 1275: Node@1275 String item: reference to object 1276, "Sally" Node next: reference to object 1284 Heap object 1284: Node@1284 String item: reference to object 1285, "Simon" Node next: null Heap object 1281: Node@1281 String item: reference to object 1282, "Supa Mike" Node next: reference to object 1272{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:18","items":["Node node: reference to object 1272","Node end: reference to object 1281","Node n: reference to object 1275"]},{"heading":"Heap object 1272: Node@1272","items":["String item: reference to object 904, \"Susan\"","Node next: reference to object 1275"]},{"heading":"Heap object 1275: Node@1275","items":["String item: reference to object 1276, \"Sally\"","Node next: reference to object 1284"]},{"heading":"Heap object 1284: Node@1284","items":["String item: reference to object 1285, \"Simon\"","Node next: null"]},{"heading":"Heap object 1281: Node@1281","items":["String item: reference to object 1282, \"Supa Mike\"","Node next: reference to object 1272"]}]}main:18Nodenode1272Nodeend1281Noden1275Node@1272Stringitem904"Susan"Nodenext1275Node@1275Stringitem1276"Sally"Nodenext1284Node@1284Stringitem1285"Simon"NodenextnullNode@1281Stringitem1282"Supa Mike"Nodenext1272

Code visualization for Code Tracing 1. Note: The debugger breakpoint is on line 18 in Driver.java. [code listing] [download] [open]

Susan
Sally
Supa Mike
Simon

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node node = new Node("Billy");
 5        node.setItem("Susan");
 6        node.setNext(new Node("Sally"));
 7        node.getNext().setNext(new Node("Barry"));
 8
 9        Node end = new Node("Supa Mike", node);
10        Node n = node.getNext();
11        n.setNext(new Node("Simon"));
12
13        System.out.println(node.getItem());                     // Output 1
14        System.out.println(node.getNext().getItem());           // Output 2
15        System.out.println(end.getItem());                      // Output 3
16        System.out.println(node.getNext().getNext().getItem()); // Output 4
17
18        System.out.println(node.getNext().getNext().getNext()); // Output 5 (what!?)
19
20        String lastItem = node.getNext().getNext().getNext().getItem();
21        System.out.println(lastItem);                           // Output 6 (reachable?)
22    } // main
23
24} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:20 Node node: reference to object 1272 Node end: reference to object 1281 Node n: reference to object 1275 Heap object 1272: Node@1272 String item: reference to object 904, "Susan" Node next: reference to object 1275 Heap object 1275: Node@1275 String item: reference to object 1276, "Sally" Node next: reference to object 1284 Heap object 1284: Node@1284 String item: reference to object 1285, "Simon" Node next: null Heap object 1281: Node@1281 String item: reference to object 1282, "Supa Mike" Node next: reference to object 1272{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:20","items":["Node node: reference to object 1272","Node end: reference to object 1281","Node n: reference to object 1275"]},{"heading":"Heap object 1272: Node@1272","items":["String item: reference to object 904, \"Susan\"","Node next: reference to object 1275"]},{"heading":"Heap object 1275: Node@1275","items":["String item: reference to object 1276, \"Sally\"","Node next: reference to object 1284"]},{"heading":"Heap object 1284: Node@1284","items":["String item: reference to object 1285, \"Simon\"","Node next: null"]},{"heading":"Heap object 1281: Node@1281","items":["String item: reference to object 1282, \"Supa Mike\"","Node next: reference to object 1272"]}]}main:20Nodenode1272Nodeend1281Noden1275Node@1272Stringitem904"Susan"Nodenext1275Node@1275Stringitem1276"Sally"Nodenext1284Node@1284Stringitem1285"Simon"NodenextnullNode@1281Stringitem1282"Supa Mike"Nodenext1272

Code visualization for Code Tracing 1. Note: The debugger breakpoint is on line 20 in Driver.java. [code listing] [download] [open]

Susan
Sally
Supa Mike
Simon
null

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node node = new Node("Billy");
 5        node.setItem("Susan");
 6        node.setNext(new Node("Sally"));
 7        node.getNext().setNext(new Node("Barry"));
 8
 9        Node end = new Node("Supa Mike", node);
10        Node n = node.getNext();
11        n.setNext(new Node("Simon"));
12
13        System.out.println(node.getItem());                     // Output 1
14        System.out.println(node.getNext().getItem());           // Output 2
15        System.out.println(end.getItem());                      // Output 3
16        System.out.println(node.getNext().getNext().getItem()); // Output 4
17
18        System.out.println(node.getNext().getNext().getNext()); // Output 5 (what!?)
19
20        String lastItem = node.getNext().getNext().getNext().getItem();
21        System.out.println(lastItem);                           // Output 6 (reachable?)
22    } // main
23
24} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:20 Node node: reference to object 1272 Node end: reference to object 1281 Node n: reference to object 1275 Heap object 1272: Node@1272 String item: reference to object 904, "Susan" Node next: reference to object 1275 Heap object 1275: Node@1275 String item: reference to object 1276, "Sally" Node next: reference to object 1284 Heap object 1284: Node@1284 String item: reference to object 1285, "Simon" Node next: null Heap object 1281: Node@1281 String item: reference to object 1282, "Supa Mike" Node next: reference to object 1272{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:20","items":["Node node: reference to object 1272","Node end: reference to object 1281","Node n: reference to object 1275"]},{"heading":"Heap object 1272: Node@1272","items":["String item: reference to object 904, \"Susan\"","Node next: reference to object 1275"]},{"heading":"Heap object 1275: Node@1275","items":["String item: reference to object 1276, \"Sally\"","Node next: reference to object 1284"]},{"heading":"Heap object 1284: Node@1284","items":["String item: reference to object 1285, \"Simon\"","Node next: null"]},{"heading":"Heap object 1281: Node@1281","items":["String item: reference to object 1282, \"Supa Mike\"","Node next: reference to object 1272"]}]}main:20Nodenode1272Nodeend1281Noden1275Node@1272Stringitem904"Susan"Nodenext1275Node@1275Stringitem1276"Sally"Nodenext1284Node@1284Stringitem1285"Simon"NodenextnullNode@1281Stringitem1282"Supa Mike"Nodenext1272

Code visualization for Code Tracing 1. Note: The debugger breakpoint is on line 20 in Driver.java. [code listing] [download] [open]

Susan
Sally
Supa Mike
Simon
null
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Node.getItem()" because the return value of "Node.getNext()" is null
	at Driver.main(Driver.java:20)

>_ Console Output

Code Writing 1
Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:7 Node head: reference to object 1296 Heap object 1296: Node@1296 String item: reference to object 1297, "first" Node next: reference to object 1298 Heap object 1298: Node@1298 String item: reference to object 1300, "second" Node next: reference to object 1301 Heap object 1301: Node@1301 String item: reference to object 1303, "third" Node next: null{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:7","items":["Node head: reference to object 1296"]},{"heading":"Heap object 1296: Node@1296","items":["String item: reference to object 1297, \"first\"","Node next: reference to object 1298"]},{"heading":"Heap object 1298: Node@1298","items":["String item: reference to object 1300, \"second\"","Node next: reference to object 1301"]},{"heading":"Heap object 1301: Node@1301","items":["String item: reference to object 1303, \"third\"","Node next: null"]}]}main:7Nodehead1296Node@1296Stringitem1297"first"Nodenext1298Node@1298Stringitem1300"second"Nodenext1301Node@1301Stringitem1303"third"Nodenextnull

Final captured memory state. [download] [open]

In your groups, write the code to produce a linked list that looks like the one depicted in the memory map above.

Code Writing 1: Sample Solutions
Sample Solution 1

Note

The sample solution approaches the problem by repeatedly prepending nodes in the linked list.

Step 1 of 4: Driver.java:4
Listing 72 Code Writing 1: Sample Solution 1.
Node head = new Node("third", null); // line 4
head = new Node("second", head);     // line 5
head = new Node("first", head);      // line 6

Driver.java

1public class Driver {
2
3    public static void main(String[] args) {
4        Node head = new Node("third", null); // line 4
5        head = new Node("second", head);     // line 5
6        head = new Node("first", head);      // line 6
7    } // main
8
9} // Driver
Java program memory state. 1 stack frame; 0 heap objects.Stack frame: main:4 No visible entries.{"summary":"Java program memory state. 1 stack frame; 0 heap objects.","sections":[{"heading":"Stack frame: main:4","items":[]}]}main:4

Memory Map for Code Writing 1: Sample Solution 1. Note: The debugger breakpoint is on line 4 in Driver.java. [code listing] [download] [open]

Driver.java

1public class Driver {
2
3    public static void main(String[] args) {
4        Node head = new Node("third", null); // line 4
5        head = new Node("second", head);     // line 5
6        head = new Node("first", head);      // line 6
7    } // main
8
9} // Driver
Java program memory state. 1 stack frame; 1 heap object.Stack frame: main:5 Node head: reference to object 1315 Heap object 1315: Node@1315 String item: reference to object 1303, "third" Node next: null{"summary":"Java program memory state. 1 stack frame; 1 heap object.","sections":[{"heading":"Stack frame: main:5","items":["Node head: reference to object 1315"]},{"heading":"Heap object 1315: Node@1315","items":["String item: reference to object 1303, \"third\"","Node next: null"]}]}main:5Nodehead1315Node@1315Stringitem1303"third"Nodenextnull

Memory Map for Code Writing 1: Sample Solution 1. Note: The debugger breakpoint is on line 5 in Driver.java. [code listing] [download] [open]

Driver.java

1public class Driver {
2
3    public static void main(String[] args) {
4        Node head = new Node("third", null); // line 4
5        head = new Node("second", head);     // line 5
6        head = new Node("first", head);      // line 6
7    } // main
8
9} // Driver
Java program memory state. 1 stack frame; 2 heap objects.Stack frame: main:6 Node head: reference to object 1316 Heap object 1316: Node@1316 String item: reference to object 1300, "second" Node next: reference to object 1315 Heap object 1315: Node@1315 String item: reference to object 1303, "third" Node next: null{"summary":"Java program memory state. 1 stack frame; 2 heap objects.","sections":[{"heading":"Stack frame: main:6","items":["Node head: reference to object 1316"]},{"heading":"Heap object 1316: Node@1316","items":["String item: reference to object 1300, \"second\"","Node next: reference to object 1315"]},{"heading":"Heap object 1315: Node@1315","items":["String item: reference to object 1303, \"third\"","Node next: null"]}]}main:6Nodehead1316Node@1316Stringitem1300"second"Nodenext1315Node@1315Stringitem1303"third"Nodenextnull

Memory Map for Code Writing 1: Sample Solution 1. Note: The debugger breakpoint is on line 6 in Driver.java. [code listing] [download] [open]

Driver.java

1public class Driver {
2
3    public static void main(String[] args) {
4        Node head = new Node("third", null); // line 4
5        head = new Node("second", head);     // line 5
6        head = new Node("first", head);      // line 6
7    } // main
8
9} // Driver
Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:7 Node head: reference to object 1317 Heap object 1317: Node@1317 String item: reference to object 1297, "first" Node next: reference to object 1316 Heap object 1316: Node@1316 String item: reference to object 1300, "second" Node next: reference to object 1315 Heap object 1315: Node@1315 String item: reference to object 1303, "third" Node next: null{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:7","items":["Node head: reference to object 1317"]},{"heading":"Heap object 1317: Node@1317","items":["String item: reference to object 1297, \"first\"","Node next: reference to object 1316"]},{"heading":"Heap object 1316: Node@1316","items":["String item: reference to object 1300, \"second\"","Node next: reference to object 1315"]},{"heading":"Heap object 1315: Node@1315","items":["String item: reference to object 1303, \"third\"","Node next: null"]}]}main:7Nodehead1317Node@1317Stringitem1297"first"Nodenext1316Node@1316Stringitem1300"second"Nodenext1315Node@1315Stringitem1303"third"Nodenextnull

Memory Map for Code Writing 1: Sample Solution 1. Note: The debugger breakpoint is on line 7 in Driver.java. [code listing] [download] [open]

Sample Solution 2

Note

The sample solution approaches the problem by repeatedly appending nodes in the linked list. It does not scale well.

Step 1 of 4: Driver.java:4
Listing 73 Code Writing: Sample Solution 2.
Node head = new Node("first", null);
head.setNext(new Node("second", null));
head.getNext().setNext(new Node("third", null));

Driver.java

1public class Driver {
2
3    public static void main(String[] args) {
4        Node head = new Node("first", null);
5        head.setNext(new Node("second", null));
6        head.getNext().setNext(new Node("third", null));
7    } // main
8
9} // Driver
Java program memory state. 1 stack frame; 0 heap objects.Stack frame: main:4 No visible entries.{"summary":"Java program memory state. 1 stack frame; 0 heap objects.","sections":[{"heading":"Stack frame: main:4","items":[]}]}main:4

Code Writing: Sample Solution 2. Note: The debugger breakpoint is on line 4 in Driver.java. [code listing] [download] [open]

Driver.java

1public class Driver {
2
3    public static void main(String[] args) {
4        Node head = new Node("first", null);
5        head.setNext(new Node("second", null));
6        head.getNext().setNext(new Node("third", null));
7    } // main
8
9} // Driver
Java program memory state. 1 stack frame; 1 heap object.Stack frame: main:5 Node head: reference to object 1300 Heap object 1300: Node@1300 String item: reference to object 1301, "first" Node next: null{"summary":"Java program memory state. 1 stack frame; 1 heap object.","sections":[{"heading":"Stack frame: main:5","items":["Node head: reference to object 1300"]},{"heading":"Heap object 1300: Node@1300","items":["String item: reference to object 1301, \"first\"","Node next: null"]}]}main:5Nodehead1300Node@1300Stringitem1301"first"Nodenextnull

Code Writing: Sample Solution 2. Note: The debugger breakpoint is on line 5 in Driver.java. [code listing] [download] [open]

Driver.java

1public class Driver {
2
3    public static void main(String[] args) {
4        Node head = new Node("first", null);
5        head.setNext(new Node("second", null));
6        head.getNext().setNext(new Node("third", null));
7    } // main
8
9} // Driver
Java program memory state. 1 stack frame; 2 heap objects.Stack frame: main:6 Node head: reference to object 1300 Heap object 1300: Node@1300 String item: reference to object 1301, "first" Node next: reference to object 1303 Heap object 1303: Node@1303 String item: reference to object 1304, "second" Node next: null{"summary":"Java program memory state. 1 stack frame; 2 heap objects.","sections":[{"heading":"Stack frame: main:6","items":["Node head: reference to object 1300"]},{"heading":"Heap object 1300: Node@1300","items":["String item: reference to object 1301, \"first\"","Node next: reference to object 1303"]},{"heading":"Heap object 1303: Node@1303","items":["String item: reference to object 1304, \"second\"","Node next: null"]}]}main:6Nodehead1300Node@1300Stringitem1301"first"Nodenext1303Node@1303Stringitem1304"second"Nodenextnull

Code Writing: Sample Solution 2. Note: The debugger breakpoint is on line 6 in Driver.java. [code listing] [download] [open]

Driver.java

1public class Driver {
2
3    public static void main(String[] args) {
4        Node head = new Node("first", null);
5        head.setNext(new Node("second", null));
6        head.getNext().setNext(new Node("third", null));
7    } // main
8
9} // Driver
Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:7 Node head: reference to object 1300 Heap object 1300: Node@1300 String item: reference to object 1301, "first" Node next: reference to object 1303 Heap object 1303: Node@1303 String item: reference to object 1304, "second" Node next: reference to object 1306 Heap object 1306: Node@1306 String item: reference to object 1307, "third" Node next: null{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:7","items":["Node head: reference to object 1300"]},{"heading":"Heap object 1300: Node@1300","items":["String item: reference to object 1301, \"first\"","Node next: reference to object 1303"]},{"heading":"Heap object 1303: Node@1303","items":["String item: reference to object 1304, \"second\"","Node next: reference to object 1306"]},{"heading":"Heap object 1306: Node@1306","items":["String item: reference to object 1307, \"third\"","Node next: null"]}]}main:7Nodehead1300Node@1300Stringitem1301"first"Nodenext1303Node@1303Stringitem1304"second"Nodenext1306Node@1306Stringitem1307"third"Nodenextnull

Code Writing: Sample Solution 2. Note: The debugger breakpoint is on line 7 in Driver.java. [code listing] [download] [open]

Sample Solution 3

Note

This sample solution does not match up exactly since it introduces additional local variables (besides just head) that were not in the original memory map.

Step 1 of 7: Driver.java:4
Listing 74 Code Writing: Sample Solution 3.
Node first = new Node("first", null);
Node second = new Node("second", null);
Node third = new Node("third", null);

first.setNext(second);
second.setNext(third);

Node head = first;

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node first = new Node("first", null);
 5        Node second = new Node("second", null);
 6        Node third = new Node("third", null);
 7
 8        first.setNext(second);
 9        second.setNext(third);
10
11        Node head = first;
12    } // main
13
14} // Driver
Java program memory state. 1 stack frame; 0 heap objects.Stack frame: main:4 No visible entries.{"summary":"Java program memory state. 1 stack frame; 0 heap objects.","sections":[{"heading":"Stack frame: main:4","items":[]}]}main:4

Code Writing: Sample Solution 3. Note: The debugger breakpoint is on line 4 in Driver.java. [code listing] [download] [open]

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node first = new Node("first", null);
 5        Node second = new Node("second", null);
 6        Node third = new Node("third", null);
 7
 8        first.setNext(second);
 9        second.setNext(third);
10
11        Node head = first;
12    } // main
13
14} // Driver
Java program memory state. 1 stack frame; 1 heap object.Stack frame: main:5 Node first: reference to object 1328 Heap object 1328: Node@1328 String item: reference to object 1297, "first" Node next: null{"summary":"Java program memory state. 1 stack frame; 1 heap object.","sections":[{"heading":"Stack frame: main:5","items":["Node first: reference to object 1328"]},{"heading":"Heap object 1328: Node@1328","items":["String item: reference to object 1297, \"first\"","Node next: null"]}]}main:5Nodefirst1328Node@1328Stringitem1297"first"Nodenextnull

Code Writing: Sample Solution 3. Note: The debugger breakpoint is on line 5 in Driver.java. [code listing] [download] [open]

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node first = new Node("first", null);
 5        Node second = new Node("second", null);
 6        Node third = new Node("third", null);
 7
 8        first.setNext(second);
 9        second.setNext(third);
10
11        Node head = first;
12    } // main
13
14} // Driver
Java program memory state. 1 stack frame; 2 heap objects.Stack frame: main:6 Node first: reference to object 1328 Node second: reference to object 1329 Heap object 1328: Node@1328 String item: reference to object 1297, "first" Node next: null Heap object 1329: Node@1329 String item: reference to object 1300, "second" Node next: null{"summary":"Java program memory state. 1 stack frame; 2 heap objects.","sections":[{"heading":"Stack frame: main:6","items":["Node first: reference to object 1328","Node second: reference to object 1329"]},{"heading":"Heap object 1328: Node@1328","items":["String item: reference to object 1297, \"first\"","Node next: null"]},{"heading":"Heap object 1329: Node@1329","items":["String item: reference to object 1300, \"second\"","Node next: null"]}]}main:6Nodefirst1328Nodesecond1329Node@1328Stringitem1297"first"NodenextnullNode@1329Stringitem1300"second"Nodenextnull

Code Writing: Sample Solution 3. Note: The debugger breakpoint is on line 6 in Driver.java. [code listing] [download] [open]

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node first = new Node("first", null);
 5        Node second = new Node("second", null);
 6        Node third = new Node("third", null);
 7
 8        first.setNext(second);
 9        second.setNext(third);
10
11        Node head = first;
12    } // main
13
14} // Driver
Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:8 Node first: reference to object 1328 Node second: reference to object 1329 Node third: reference to object 1330 Heap object 1328: Node@1328 String item: reference to object 1297, "first" Node next: null Heap object 1329: Node@1329 String item: reference to object 1300, "second" Node next: null Heap object 1330: Node@1330 String item: reference to object 1303, "third" Node next: null{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:8","items":["Node first: reference to object 1328","Node second: reference to object 1329","Node third: reference to object 1330"]},{"heading":"Heap object 1328: Node@1328","items":["String item: reference to object 1297, \"first\"","Node next: null"]},{"heading":"Heap object 1329: Node@1329","items":["String item: reference to object 1300, \"second\"","Node next: null"]},{"heading":"Heap object 1330: Node@1330","items":["String item: reference to object 1303, \"third\"","Node next: null"]}]}main:8Nodefirst1328Nodesecond1329Nodethird1330Node@1328Stringitem1297"first"NodenextnullNode@1329Stringitem1300"second"NodenextnullNode@1330Stringitem1303"third"Nodenextnull

Code Writing: Sample Solution 3. Note: The debugger breakpoint is on line 8 in Driver.java. [code listing] [download] [open]

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node first = new Node("first", null);
 5        Node second = new Node("second", null);
 6        Node third = new Node("third", null);
 7
 8        first.setNext(second);
 9        second.setNext(third);
10
11        Node head = first;
12    } // main
13
14} // Driver
Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:9 Node first: reference to object 1328 Node second: reference to object 1329 Node third: reference to object 1330 Heap object 1328: Node@1328 String item: reference to object 1297, "first" Node next: reference to object 1329 Heap object 1329: Node@1329 String item: reference to object 1300, "second" Node next: null Heap object 1330: Node@1330 String item: reference to object 1303, "third" Node next: null{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:9","items":["Node first: reference to object 1328","Node second: reference to object 1329","Node third: reference to object 1330"]},{"heading":"Heap object 1328: Node@1328","items":["String item: reference to object 1297, \"first\"","Node next: reference to object 1329"]},{"heading":"Heap object 1329: Node@1329","items":["String item: reference to object 1300, \"second\"","Node next: null"]},{"heading":"Heap object 1330: Node@1330","items":["String item: reference to object 1303, \"third\"","Node next: null"]}]}main:9Nodefirst1328Nodesecond1329Nodethird1330Node@1328Stringitem1297"first"Nodenext1329Node@1329Stringitem1300"second"NodenextnullNode@1330Stringitem1303"third"Nodenextnull

Code Writing: Sample Solution 3. Note: The debugger breakpoint is on line 9 in Driver.java. [code listing] [download] [open]

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node first = new Node("first", null);
 5        Node second = new Node("second", null);
 6        Node third = new Node("third", null);
 7
 8        first.setNext(second);
 9        second.setNext(third);
10
11        Node head = first;
12    } // main
13
14} // Driver
Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:11 Node first: reference to object 1328 Node second: reference to object 1329 Node third: reference to object 1330 Heap object 1328: Node@1328 String item: reference to object 1297, "first" Node next: reference to object 1329 Heap object 1329: Node@1329 String item: reference to object 1300, "second" Node next: reference to object 1330 Heap object 1330: Node@1330 String item: reference to object 1303, "third" Node next: null{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:11","items":["Node first: reference to object 1328","Node second: reference to object 1329","Node third: reference to object 1330"]},{"heading":"Heap object 1328: Node@1328","items":["String item: reference to object 1297, \"first\"","Node next: reference to object 1329"]},{"heading":"Heap object 1329: Node@1329","items":["String item: reference to object 1300, \"second\"","Node next: reference to object 1330"]},{"heading":"Heap object 1330: Node@1330","items":["String item: reference to object 1303, \"third\"","Node next: null"]}]}main:11Nodefirst1328Nodesecond1329Nodethird1330Node@1328Stringitem1297"first"Nodenext1329Node@1329Stringitem1300"second"Nodenext1330Node@1330Stringitem1303"third"Nodenextnull

Code Writing: Sample Solution 3. Note: The debugger breakpoint is on line 11 in Driver.java. [code listing] [download] [open]

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node first = new Node("first", null);
 5        Node second = new Node("second", null);
 6        Node third = new Node("third", null);
 7
 8        first.setNext(second);
 9        second.setNext(third);
10
11        Node head = first;
12    } // main
13
14} // Driver
Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:12 Node first: reference to object 1328 Node second: reference to object 1329 Node third: reference to object 1330 Node head: reference to object 1328 Heap object 1328: Node@1328 String item: reference to object 1297, "first" Node next: reference to object 1329 Heap object 1329: Node@1329 String item: reference to object 1300, "second" Node next: reference to object 1330 Heap object 1330: Node@1330 String item: reference to object 1303, "third" Node next: null{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:12","items":["Node first: reference to object 1328","Node second: reference to object 1329","Node third: reference to object 1330","Node head: reference to object 1328"]},{"heading":"Heap object 1328: Node@1328","items":["String item: reference to object 1297, \"first\"","Node next: reference to object 1329"]},{"heading":"Heap object 1329: Node@1329","items":["String item: reference to object 1300, \"second\"","Node next: reference to object 1330"]},{"heading":"Heap object 1330: Node@1330","items":["String item: reference to object 1303, \"third\"","Node next: null"]}]}main:12Nodefirst1328Nodesecond1329Nodethird1330Nodehead1328Node@1328Stringitem1297"first"Nodenext1329Node@1329Stringitem1300"second"Nodenext1330Node@1330Stringitem1303"third"Nodenextnull

Code Writing: Sample Solution 3. Note: The debugger breakpoint is on line 12 in Driver.java. [code listing] [download] [open]

Sample Solution 4

Note

We do NOT recommend this one. It works, but it is hard to read.

Step 1 of 2: Driver.java:6
Listing 75 Code Writing: Sample Solution 4.
// Node head = new Node("first", new Node("second", new Node("third")));

Node head = new Node(
    "first",
    new Node(
        "second",
        new Node(
            "third",
            null
        )
    )
);

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        // Node head = new Node("first", new Node("second", new Node("third")));
 5
 6        Node head = new Node(
 7            "first",
 8            new Node(
 9                "second",
10                new Node(
11                    "third",
12                    null
13                )
14            )
15        );
16    } // main
17
18} // Driver
Java program memory state. 1 stack frame; 0 heap objects.Stack frame: main:6 No visible entries.{"summary":"Java program memory state. 1 stack frame; 0 heap objects.","sections":[{"heading":"Stack frame: main:6","items":[]}]}main:6

Code Writing: Sample Solution 4. Note: The debugger breakpoint is on line 6 in Driver.java. [code listing] [download] [open]

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        // Node head = new Node("first", new Node("second", new Node("third")));
 5
 6        Node head = new Node(
 7            "first",
 8            new Node(
 9                "second",
10                new Node(
11                    "third",
12                    null
13                )
14            )
15        );
16    } // main
17
18} // Driver
Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:16 Node head: reference to object 1321 Heap object 1321: Node@1321 String item: reference to object 1301, "first" Node next: reference to object 1320 Heap object 1320: Node@1320 String item: reference to object 1304, "second" Node next: reference to object 1319 Heap object 1319: Node@1319 String item: reference to object 1307, "third" Node next: null{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:16","items":["Node head: reference to object 1321"]},{"heading":"Heap object 1321: Node@1321","items":["String item: reference to object 1301, \"first\"","Node next: reference to object 1320"]},{"heading":"Heap object 1320: Node@1320","items":["String item: reference to object 1304, \"second\"","Node next: reference to object 1319"]},{"heading":"Heap object 1319: Node@1319","items":["String item: reference to object 1307, \"third\"","Node next: null"]}]}main:16Nodehead1321Node@1321Stringitem1301"first"Nodenext1320Node@1320Stringitem1304"second"Nodenext1319Node@1319Stringitem1307"third"Nodenextnull

Code Writing: Sample Solution 4. Note: The debugger breakpoint is on line 16 in Driver.java. [code listing] [download] [open]

Sample Solution 5

Note

This sample solution inserts the node for "second" last, but it still produces the same final result.

Step 1 of 4: Driver.java:4
Listing 76 Code Writing: Sample Solution 5.
Node head = new Node("first");
head.setNext(new Node("third"));
head.setNext(new Node("second", head.getNext()));

Driver.java

1public class Driver {
2
3    public static void main(String[] args) {
4        Node head = new Node("first");
5        head.setNext(new Node("third"));
6        head.setNext(new Node("second", head.getNext()));
7    } // main
8
9} // Driver
Java program memory state. 1 stack frame; 0 heap objects.Stack frame: main:4 No visible entries.{"summary":"Java program memory state. 1 stack frame; 0 heap objects.","sections":[{"heading":"Stack frame: main:4","items":[]}]}main:4

Code Writing: Sample Solution 5. Note: The debugger breakpoint is on line 4 in Driver.java. [code listing] [download] [open]

Driver.java

1public class Driver {
2
3    public static void main(String[] args) {
4        Node head = new Node("first");
5        head.setNext(new Node("third"));
6        head.setNext(new Node("second", head.getNext()));
7    } // main
8
9} // Driver
Java program memory state. 1 stack frame; 1 heap object.Stack frame: main:5 Node head: reference to object 1332 Heap object 1332: Node@1332 String item: reference to object 1301, "first" Node next: null{"summary":"Java program memory state. 1 stack frame; 1 heap object.","sections":[{"heading":"Stack frame: main:5","items":["Node head: reference to object 1332"]},{"heading":"Heap object 1332: Node@1332","items":["String item: reference to object 1301, \"first\"","Node next: null"]}]}main:5Nodehead1332Node@1332Stringitem1301"first"Nodenextnull

Code Writing: Sample Solution 5. Note: The debugger breakpoint is on line 5 in Driver.java. [code listing] [download] [open]

Driver.java

1public class Driver {
2
3    public static void main(String[] args) {
4        Node head = new Node("first");
5        head.setNext(new Node("third"));
6        head.setNext(new Node("second", head.getNext()));
7    } // main
8
9} // Driver
Java program memory state. 1 stack frame; 2 heap objects.Stack frame: main:6 Node head: reference to object 1332 Heap object 1332: Node@1332 String item: reference to object 1301, "first" Node next: reference to object 1333 Heap object 1333: Node@1333 String item: reference to object 1307, "third" Node next: null{"summary":"Java program memory state. 1 stack frame; 2 heap objects.","sections":[{"heading":"Stack frame: main:6","items":["Node head: reference to object 1332"]},{"heading":"Heap object 1332: Node@1332","items":["String item: reference to object 1301, \"first\"","Node next: reference to object 1333"]},{"heading":"Heap object 1333: Node@1333","items":["String item: reference to object 1307, \"third\"","Node next: null"]}]}main:6Nodehead1332Node@1332Stringitem1301"first"Nodenext1333Node@1333Stringitem1307"third"Nodenextnull

Code Writing: Sample Solution 5. Note: The debugger breakpoint is on line 6 in Driver.java. [code listing] [download] [open]

Driver.java

1public class Driver {
2
3    public static void main(String[] args) {
4        Node head = new Node("first");
5        head.setNext(new Node("third"));
6        head.setNext(new Node("second", head.getNext()));
7    } // main
8
9} // Driver
Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:7 Node head: reference to object 1332 Heap object 1332: Node@1332 String item: reference to object 1301, "first" Node next: reference to object 1334 Heap object 1334: Node@1334 String item: reference to object 1304, "second" Node next: reference to object 1333 Heap object 1333: Node@1333 String item: reference to object 1307, "third" Node next: null{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:7","items":["Node head: reference to object 1332"]},{"heading":"Heap object 1332: Node@1332","items":["String item: reference to object 1301, \"first\"","Node next: reference to object 1334"]},{"heading":"Heap object 1334: Node@1334","items":["String item: reference to object 1304, \"second\"","Node next: reference to object 1333"]},{"heading":"Heap object 1333: Node@1333","items":["String item: reference to object 1307, \"third\"","Node next: null"]}]}main:7Nodehead1332Node@1332Stringitem1301"first"Nodenext1334Node@1334Stringitem1304"second"Nodenext1333Node@1333Stringitem1307"third"Nodenextnull

Code Writing: Sample Solution 5. Note: The debugger breakpoint is on line 7 in Driver.java. [code listing] [download] [open]

Code Tracing 2

Draw the memory map for the code below and write the output produced by the following code:

 4Node head = new Node("date");
 5head = new Node("cherry", head);
 6head = new Node("banana", head);
 7head = new Node("apple", head);
 8
 9Node current = head;
10while (current != null) {
11   System.out.print(current.getItem() + " ");
12   current = current.getNext();
13} // while
Memory Maps

Note

The final two steps below show what memory looks like just before and immediately after executing the while-loop.

Step 1 of 19: Driver.java:4

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 0 heap objects.Stack frame: main:4 No visible entries.{"summary":"Java program memory state. 1 stack frame; 0 heap objects.","sections":[{"heading":"Stack frame: main:4","items":[]}]}main:4

Memory state at the breakpoint on line 4 in Driver.java. [code listing] [download] [open]

> (no output yet)

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 1 heap object.Stack frame: main:5 Node head: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 1 heap object.","sections":[{"heading":"Stack frame: main:5","items":["Node head: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:5Nodehead1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 5 in Driver.java. [code listing] [download] [open]

> (no output yet)

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 2 heap objects.Stack frame: main:6 Node head: reference to object 1344 Heap object 1344: Node@1344 String item: reference to object 1345, "cherry" Node next: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 2 heap objects.","sections":[{"heading":"Stack frame: main:6","items":["Node head: reference to object 1344"]},{"heading":"Heap object 1344: Node@1344","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:6Nodehead1344Node@1344Stringitem1345"cherry"Nodenext1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 6 in Driver.java. [code listing] [download] [open]

> (no output yet)

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:7 Node head: reference to object 1347 Heap object 1347: Node@1347 String item: reference to object 1348, "banana" Node next: reference to object 1344 Heap object 1344: Node@1344 String item: reference to object 1345, "cherry" Node next: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:7","items":["Node head: reference to object 1347"]},{"heading":"Heap object 1347: Node@1347","items":["String item: reference to object 1348, \"banana\"","Node next: reference to object 1344"]},{"heading":"Heap object 1344: Node@1344","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:7Nodehead1347Node@1347Stringitem1348"banana"Nodenext1344Node@1344Stringitem1345"cherry"Nodenext1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 7 in Driver.java. [code listing] [download] [open]

> (no output yet)

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:9 Node head: reference to object 1350 Heap object 1350: Node@1350 String item: reference to object 1351, "apple" Node next: reference to object 1347 Heap object 1347: Node@1347 String item: reference to object 1348, "banana" Node next: reference to object 1344 Heap object 1344: Node@1344 String item: reference to object 1345, "cherry" Node next: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:9","items":["Node head: reference to object 1350"]},{"heading":"Heap object 1350: Node@1350","items":["String item: reference to object 1351, \"apple\"","Node next: reference to object 1347"]},{"heading":"Heap object 1347: Node@1347","items":["String item: reference to object 1348, \"banana\"","Node next: reference to object 1344"]},{"heading":"Heap object 1344: Node@1344","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:9Nodehead1350Node@1350Stringitem1351"apple"Nodenext1347Node@1347Stringitem1348"banana"Nodenext1344Node@1344Stringitem1345"cherry"Nodenext1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 9 in Driver.java. [code listing] [download] [open]

> (no output yet)

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:10 Node head: reference to object 1350 Node current: reference to object 1350 Heap object 1350: Node@1350 String item: reference to object 1351, "apple" Node next: reference to object 1347 Heap object 1347: Node@1347 String item: reference to object 1348, "banana" Node next: reference to object 1344 Heap object 1344: Node@1344 String item: reference to object 1345, "cherry" Node next: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:10","items":["Node head: reference to object 1350","Node current: reference to object 1350"]},{"heading":"Heap object 1350: Node@1350","items":["String item: reference to object 1351, \"apple\"","Node next: reference to object 1347"]},{"heading":"Heap object 1347: Node@1347","items":["String item: reference to object 1348, \"banana\"","Node next: reference to object 1344"]},{"heading":"Heap object 1344: Node@1344","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:10Nodehead1350Nodecurrent1350Node@1350Stringitem1351"apple"Nodenext1347Node@1347Stringitem1348"banana"Nodenext1344Node@1344Stringitem1345"cherry"Nodenext1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 10 in Driver.java. [code listing] [download] [open]

> (no output yet)

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:11 Node head: reference to object 1350 Node current: reference to object 1350 Heap object 1350: Node@1350 String item: reference to object 1351, "apple" Node next: reference to object 1347 Heap object 1347: Node@1347 String item: reference to object 1348, "banana" Node next: reference to object 1344 Heap object 1344: Node@1344 String item: reference to object 1345, "cherry" Node next: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:11","items":["Node head: reference to object 1350","Node current: reference to object 1350"]},{"heading":"Heap object 1350: Node@1350","items":["String item: reference to object 1351, \"apple\"","Node next: reference to object 1347"]},{"heading":"Heap object 1347: Node@1347","items":["String item: reference to object 1348, \"banana\"","Node next: reference to object 1344"]},{"heading":"Heap object 1344: Node@1344","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:11Nodehead1350Nodecurrent1350Node@1350Stringitem1351"apple"Nodenext1347Node@1347Stringitem1348"banana"Nodenext1344Node@1344Stringitem1345"cherry"Nodenext1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 11 in Driver.java. [code listing] [download] [open]

> (no output yet)

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:12 Node head: reference to object 1350 Node current: reference to object 1350 Heap object 1350: Node@1350 String item: reference to object 1351, "apple" Node next: reference to object 1347 Heap object 1347: Node@1347 String item: reference to object 1348, "banana" Node next: reference to object 1344 Heap object 1344: Node@1344 String item: reference to object 1345, "cherry" Node next: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:12","items":["Node head: reference to object 1350","Node current: reference to object 1350"]},{"heading":"Heap object 1350: Node@1350","items":["String item: reference to object 1351, \"apple\"","Node next: reference to object 1347"]},{"heading":"Heap object 1347: Node@1347","items":["String item: reference to object 1348, \"banana\"","Node next: reference to object 1344"]},{"heading":"Heap object 1344: Node@1344","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:12Nodehead1350Nodecurrent1350Node@1350Stringitem1351"apple"Nodenext1347Node@1347Stringitem1348"banana"Nodenext1344Node@1344Stringitem1345"cherry"Nodenext1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 12 in Driver.java. [code listing] [download] [open]

apple 

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:10 Node head: reference to object 1350 Node current: reference to object 1347 Heap object 1350: Node@1350 String item: reference to object 1351, "apple" Node next: reference to object 1347 Heap object 1347: Node@1347 String item: reference to object 1348, "banana" Node next: reference to object 1344 Heap object 1344: Node@1344 String item: reference to object 1345, "cherry" Node next: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:10","items":["Node head: reference to object 1350","Node current: reference to object 1347"]},{"heading":"Heap object 1350: Node@1350","items":["String item: reference to object 1351, \"apple\"","Node next: reference to object 1347"]},{"heading":"Heap object 1347: Node@1347","items":["String item: reference to object 1348, \"banana\"","Node next: reference to object 1344"]},{"heading":"Heap object 1344: Node@1344","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:10Nodehead1350Nodecurrent1347Node@1350Stringitem1351"apple"Nodenext1347Node@1347Stringitem1348"banana"Nodenext1344Node@1344Stringitem1345"cherry"Nodenext1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 10 in Driver.java. [code listing] [download] [open]

apple 

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:11 Node head: reference to object 1350 Node current: reference to object 1347 Heap object 1350: Node@1350 String item: reference to object 1351, "apple" Node next: reference to object 1347 Heap object 1347: Node@1347 String item: reference to object 1348, "banana" Node next: reference to object 1344 Heap object 1344: Node@1344 String item: reference to object 1345, "cherry" Node next: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:11","items":["Node head: reference to object 1350","Node current: reference to object 1347"]},{"heading":"Heap object 1350: Node@1350","items":["String item: reference to object 1351, \"apple\"","Node next: reference to object 1347"]},{"heading":"Heap object 1347: Node@1347","items":["String item: reference to object 1348, \"banana\"","Node next: reference to object 1344"]},{"heading":"Heap object 1344: Node@1344","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:11Nodehead1350Nodecurrent1347Node@1350Stringitem1351"apple"Nodenext1347Node@1347Stringitem1348"banana"Nodenext1344Node@1344Stringitem1345"cherry"Nodenext1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 11 in Driver.java. [code listing] [download] [open]

apple 

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:12 Node head: reference to object 1350 Node current: reference to object 1347 Heap object 1350: Node@1350 String item: reference to object 1351, "apple" Node next: reference to object 1347 Heap object 1347: Node@1347 String item: reference to object 1348, "banana" Node next: reference to object 1344 Heap object 1344: Node@1344 String item: reference to object 1345, "cherry" Node next: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:12","items":["Node head: reference to object 1350","Node current: reference to object 1347"]},{"heading":"Heap object 1350: Node@1350","items":["String item: reference to object 1351, \"apple\"","Node next: reference to object 1347"]},{"heading":"Heap object 1347: Node@1347","items":["String item: reference to object 1348, \"banana\"","Node next: reference to object 1344"]},{"heading":"Heap object 1344: Node@1344","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:12Nodehead1350Nodecurrent1347Node@1350Stringitem1351"apple"Nodenext1347Node@1347Stringitem1348"banana"Nodenext1344Node@1344Stringitem1345"cherry"Nodenext1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 12 in Driver.java. [code listing] [download] [open]

apple banana 

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:10 Node head: reference to object 1350 Node current: reference to object 1344 Heap object 1350: Node@1350 String item: reference to object 1351, "apple" Node next: reference to object 1347 Heap object 1347: Node@1347 String item: reference to object 1348, "banana" Node next: reference to object 1344 Heap object 1344: Node@1344 String item: reference to object 1345, "cherry" Node next: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:10","items":["Node head: reference to object 1350","Node current: reference to object 1344"]},{"heading":"Heap object 1350: Node@1350","items":["String item: reference to object 1351, \"apple\"","Node next: reference to object 1347"]},{"heading":"Heap object 1347: Node@1347","items":["String item: reference to object 1348, \"banana\"","Node next: reference to object 1344"]},{"heading":"Heap object 1344: Node@1344","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:10Nodehead1350Nodecurrent1344Node@1350Stringitem1351"apple"Nodenext1347Node@1347Stringitem1348"banana"Nodenext1344Node@1344Stringitem1345"cherry"Nodenext1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 10 in Driver.java. [code listing] [download] [open]

apple banana 

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:11 Node head: reference to object 1350 Node current: reference to object 1344 Heap object 1350: Node@1350 String item: reference to object 1351, "apple" Node next: reference to object 1347 Heap object 1347: Node@1347 String item: reference to object 1348, "banana" Node next: reference to object 1344 Heap object 1344: Node@1344 String item: reference to object 1345, "cherry" Node next: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:11","items":["Node head: reference to object 1350","Node current: reference to object 1344"]},{"heading":"Heap object 1350: Node@1350","items":["String item: reference to object 1351, \"apple\"","Node next: reference to object 1347"]},{"heading":"Heap object 1347: Node@1347","items":["String item: reference to object 1348, \"banana\"","Node next: reference to object 1344"]},{"heading":"Heap object 1344: Node@1344","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:11Nodehead1350Nodecurrent1344Node@1350Stringitem1351"apple"Nodenext1347Node@1347Stringitem1348"banana"Nodenext1344Node@1344Stringitem1345"cherry"Nodenext1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 11 in Driver.java. [code listing] [download] [open]

apple banana 

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:12 Node head: reference to object 1350 Node current: reference to object 1344 Heap object 1350: Node@1350 String item: reference to object 1351, "apple" Node next: reference to object 1347 Heap object 1347: Node@1347 String item: reference to object 1348, "banana" Node next: reference to object 1344 Heap object 1344: Node@1344 String item: reference to object 1345, "cherry" Node next: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:12","items":["Node head: reference to object 1350","Node current: reference to object 1344"]},{"heading":"Heap object 1350: Node@1350","items":["String item: reference to object 1351, \"apple\"","Node next: reference to object 1347"]},{"heading":"Heap object 1347: Node@1347","items":["String item: reference to object 1348, \"banana\"","Node next: reference to object 1344"]},{"heading":"Heap object 1344: Node@1344","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:12Nodehead1350Nodecurrent1344Node@1350Stringitem1351"apple"Nodenext1347Node@1347Stringitem1348"banana"Nodenext1344Node@1344Stringitem1345"cherry"Nodenext1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 12 in Driver.java. [code listing] [download] [open]

apple banana cherry 

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:10 Node head: reference to object 1350 Node current: reference to object 1341 Heap object 1350: Node@1350 String item: reference to object 1351, "apple" Node next: reference to object 1347 Heap object 1347: Node@1347 String item: reference to object 1348, "banana" Node next: reference to object 1344 Heap object 1344: Node@1344 String item: reference to object 1345, "cherry" Node next: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:10","items":["Node head: reference to object 1350","Node current: reference to object 1341"]},{"heading":"Heap object 1350: Node@1350","items":["String item: reference to object 1351, \"apple\"","Node next: reference to object 1347"]},{"heading":"Heap object 1347: Node@1347","items":["String item: reference to object 1348, \"banana\"","Node next: reference to object 1344"]},{"heading":"Heap object 1344: Node@1344","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:10Nodehead1350Nodecurrent1341Node@1350Stringitem1351"apple"Nodenext1347Node@1347Stringitem1348"banana"Nodenext1344Node@1344Stringitem1345"cherry"Nodenext1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 10 in Driver.java. [code listing] [download] [open]

apple banana cherry 

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:11 Node head: reference to object 1350 Node current: reference to object 1341 Heap object 1350: Node@1350 String item: reference to object 1351, "apple" Node next: reference to object 1347 Heap object 1347: Node@1347 String item: reference to object 1348, "banana" Node next: reference to object 1344 Heap object 1344: Node@1344 String item: reference to object 1345, "cherry" Node next: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:11","items":["Node head: reference to object 1350","Node current: reference to object 1341"]},{"heading":"Heap object 1350: Node@1350","items":["String item: reference to object 1351, \"apple\"","Node next: reference to object 1347"]},{"heading":"Heap object 1347: Node@1347","items":["String item: reference to object 1348, \"banana\"","Node next: reference to object 1344"]},{"heading":"Heap object 1344: Node@1344","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:11Nodehead1350Nodecurrent1341Node@1350Stringitem1351"apple"Nodenext1347Node@1347Stringitem1348"banana"Nodenext1344Node@1344Stringitem1345"cherry"Nodenext1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 11 in Driver.java. [code listing] [download] [open]

apple banana cherry 

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:12 Node head: reference to object 1350 Node current: reference to object 1341 Heap object 1350: Node@1350 String item: reference to object 1351, "apple" Node next: reference to object 1347 Heap object 1347: Node@1347 String item: reference to object 1348, "banana" Node next: reference to object 1344 Heap object 1344: Node@1344 String item: reference to object 1345, "cherry" Node next: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:12","items":["Node head: reference to object 1350","Node current: reference to object 1341"]},{"heading":"Heap object 1350: Node@1350","items":["String item: reference to object 1351, \"apple\"","Node next: reference to object 1347"]},{"heading":"Heap object 1347: Node@1347","items":["String item: reference to object 1348, \"banana\"","Node next: reference to object 1344"]},{"heading":"Heap object 1344: Node@1344","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:12Nodehead1350Nodecurrent1341Node@1350Stringitem1351"apple"Nodenext1347Node@1347Stringitem1348"banana"Nodenext1344Node@1344Stringitem1345"cherry"Nodenext1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 12 in Driver.java. [code listing] [download] [open]

apple banana cherry date 

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:10 Node head: reference to object 1350 Node current: null Heap object 1350: Node@1350 String item: reference to object 1351, "apple" Node next: reference to object 1347 Heap object 1347: Node@1347 String item: reference to object 1348, "banana" Node next: reference to object 1344 Heap object 1344: Node@1344 String item: reference to object 1345, "cherry" Node next: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:10","items":["Node head: reference to object 1350","Node current: null"]},{"heading":"Heap object 1350: Node@1350","items":["String item: reference to object 1351, \"apple\"","Node next: reference to object 1347"]},{"heading":"Heap object 1347: Node@1347","items":["String item: reference to object 1348, \"banana\"","Node next: reference to object 1344"]},{"heading":"Heap object 1344: Node@1344","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:10Nodehead1350NodecurrentnullNode@1350Stringitem1351"apple"Nodenext1347Node@1347Stringitem1348"banana"Nodenext1344Node@1344Stringitem1345"cherry"Nodenext1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 10 in Driver.java. [code listing] [download] [open]

apple banana cherry date 

>_ Console Output

Driver.java

 1public class Driver {
 2
 3    public static void main(String[] args) {
 4        Node head = new Node("date");
 5        head = new Node("cherry", head);
 6        head = new Node("banana", head);
 7        head = new Node("apple", head);
 8
 9        Node current = head;
10        while (current != null) {
11           System.out.print(current.getItem() + " ");
12           current = current.getNext();
13        } // while
14    } // main
15
16} // Driver
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:14 Node head: reference to object 1350 Node current: null Heap object 1350: Node@1350 String item: reference to object 1351, "apple" Node next: reference to object 1347 Heap object 1347: Node@1347 String item: reference to object 1348, "banana" Node next: reference to object 1344 Heap object 1344: Node@1344 String item: reference to object 1345, "cherry" Node next: reference to object 1341 Heap object 1341: Node@1341 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:14","items":["Node head: reference to object 1350","Node current: null"]},{"heading":"Heap object 1350: Node@1350","items":["String item: reference to object 1351, \"apple\"","Node next: reference to object 1347"]},{"heading":"Heap object 1347: Node@1347","items":["String item: reference to object 1348, \"banana\"","Node next: reference to object 1344"]},{"heading":"Heap object 1344: Node@1344","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1341"]},{"heading":"Heap object 1341: Node@1341","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:14Nodehead1350NodecurrentnullNode@1350Stringitem1351"apple"Nodenext1347Node@1347Stringitem1348"banana"Nodenext1344Node@1344Stringitem1345"cherry"Nodenext1341Node@1341Stringitem1342"date"Nodenextnull

Memory state at the breakpoint on line 14 in Driver.java. [code listing] [download] [open]

apple banana cherry date 

>_ Console Output

Solution
Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:14 Node head: reference to object 1364 Node current: null Heap object 1364: Node@1364 String item: reference to object 1351, "apple" Node next: reference to object 1365 Heap object 1365: Node@1365 String item: reference to object 1348, "banana" Node next: reference to object 1366 Heap object 1366: Node@1366 String item: reference to object 1345, "cherry" Node next: reference to object 1367 Heap object 1367: Node@1367 String item: reference to object 1342, "date" Node next: null{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:14","items":["Node head: reference to object 1364","Node current: null"]},{"heading":"Heap object 1364: Node@1364","items":["String item: reference to object 1351, \"apple\"","Node next: reference to object 1365"]},{"heading":"Heap object 1365: Node@1365","items":["String item: reference to object 1348, \"banana\"","Node next: reference to object 1366"]},{"heading":"Heap object 1366: Node@1366","items":["String item: reference to object 1345, \"cherry\"","Node next: reference to object 1367"]},{"heading":"Heap object 1367: Node@1367","items":["String item: reference to object 1342, \"date\"","Node next: null"]}]}main:14Nodehead1364NodecurrentnullNode@1364Stringitem1351"apple"Nodenext1365Node@1365Stringitem1348"banana"Nodenext1366Node@1366Stringitem1345"cherry"Nodenext1367Node@1367Stringitem1342"date"Nodenextnull

Final captured memory state. [download] [open]

Code Writing 2

In your groups, write a method with the signature below. You do not need to rewrite the Javadoc comment.

 1/**
 2 * Returns with a reference to the {@code Node} that can be
 3 * reached after traversing {@code numLinks}
 4 * many links starting at {@code node}.
 5 *
 6 * @param node the node where we begin the search.
 7 * @param numLinks the number of links to traverse.
 8 * @return node at {@code numLinks} links beyond {@code node}.
 9 */
10public static Node getNode(Node node, int numLinks) {
11    throw new UnsupportedOperationException("not yet implemented");
12} // getNode
Code Writing 3

Write a method called getItem that returns with the item reference value stored in the node that is numLinks beyond the starting node (instead of a reference to the node itself).

Can you write the method body in one line?

Implementing the Stack ADT

Implementing the Stack ADT

To see sample solutions, toggle "Show Solutions" above.

Sample solutions not included, because "Show Solutions" was not toggled before printing.

Getting Started
Warmup

Answer the following questions on your exit ticket:

  1. What is an Abstract Data Type (ADT)?

    1. A low-level description of a data structure's implementation.

    2. A predefined class in the Java library.

    3. A high-level description of the operations available on a collection of data.

    4. A specific method for implementing data structures in Java.


  2. How does polymorphism relate to ADTs in Java?

    1. Polymorphism allows multiple ADTs to be defined within the same class.

    2. Polymorphism enables the List interface to be implemented by different classes, like ArrayBasedList and LinkedBasedList.

    3. Polymorphism is only applicable when using arrays as underlying structures.

    4. Polymorphism is not used in conjunction with ADTs.


  3. Why is it beneficial to have different implementations of an ADT like the List interface?

    1. It allows the programmer to access more methods.

    2. It simplifies the process of writing new code.

    3. It eliminates the need for interfaces in Java.

    4. It provides flexibility in choosing an implementation that is more efficient for the specific application.

Code Writing 1: Sample Solutions
  1. C

  2. B

  3. D

What is a Stack?

We will implement the Stack ADT according to the following specification:

Starter Code (for instructors)

Bundle

Execute the command below to download and extract the files:

bundle1302 stack-starter
- downloading cs1302-stack-starter bundle...
- verifying integrity of downloaded files using sha256sum...
- extracting downloaded archive...
- removing intermediate files...
subdirectory cs1302-stack-starter successfully created
  • cs1302.adt: Stack interface and implementations.

  • cs1302.test: Stack test code.

  • Compile script is in the directory. It compiles everything and runs StackTester.

Starter Code (for those not on Odin)

Execute the git clone command shown below to download the files for this lesson into a directory named cs1302-adt-lesson:

git clone https://github.com/cs1302uga/cs1302-adt-lesson.git
Starter Code (for students)

Execute the adt1302 command shown below on Odin to download the files for this lesson using Git into a directory named cs1302-adt-lesson:

adt1302
+ git clone https://github.com/cs1302uga/cs1302-adt-lesson.git
Cloning into 'cs1302-adt-lesson'...
remote: Enumerating objects: 46, done.
remote: Counting objects: 100% (46/46), done.
remote: Compressing objects: 100% (26/26), done.
remote: Total 46 (delta 12), reused 40 (delta 8), pack-reused 0 (from 0)
Receiving objects: 100% (46/46), 11.58 KiB | 697.00 KiB/s, done.
Resolving deltas: 100% (12/12), done.
UML (No Tests)
Unit Testing

The code below is a slightly modified test case from our StackTester class.

 1public void unitTest() {
 2
 3   Stack stack = new OracleStack();
 4   stack.push("a");
 5   stack.push("b");
 6   stack.push("c");
 7
 8   // ...
 9
10} // unitTest

The code above could be the setup for many, separate unit tests. For each of the scenarios below, we would create a separate method (unit test) in our test class. What code could we add to the end of this method to test the following:

  • If our stack contains the correct number of elements.

  • If the correct value is at the top of the stack.

  • If the stack contains the correct values throughout.

In practice, these would be three separate test methods, even though they share the same test scenario.

UML (With Tests)
Part 1: BaseStack
Code Tracing

Draw a memory map for the code below on your exit ticket. Your diagram should include all variables (including instance variables) and objects created.

Stack stack = new ArrayStack();
Sample Solution
Java program memory state. 1 stack frame; 2 heap objects.Stack frame: main:5 Stack stack: reference to object 1347 Heap object 1349: String[]@1349 (length 3) Index 0: null Index 1: null Index 2: null Heap object 1347: ArrayStack@1347 String[] array: reference to object 1349 int size: 0{"summary":"Java program memory state. 1 stack frame; 2 heap objects.","sections":[{"heading":"Stack frame: main:5","items":["Stack stack: reference to object 1347"]},{"heading":"Heap object 1349: String[]@1349 (length 3)","items":["Index 0: null","Index 1: null","Index 2: null"]},{"heading":"Heap object 1347: ArrayStack@1347","items":["String[] array: reference to object 1349","int size: 0"]}]}main:5Stackstack1347String[]@1349 (length 3)012nullnullnullArrayStack@1347String[]array1349intsize0

Final captured memory state. [download] [open]

Inspecting the Tests

Important

If you do not have the cs1302-adt-lesson directory that was downloaded in a previous part of this lesson, then run the adt1302 command on Odin to download it using Git.

Execute the following command on Odin within the cs1302-adt-lesson directory

git checkout -b activity part1

With your groups, inspect StackTester.java in the cs1302.test package and carefully review the following methods:

  • newStack

  • stackTest01

  • stackTest02

On your exit ticket, answer the following questions about those methods:

  1. What are these methods testing?

  2. What methods will we need to implement to make sure we pass these tests?

Implementation

To pass the current set of tests, implement the following methods with your group:

Class

Method

Note

BaseStack

default constructor

Initialize instance variables appropriately.

BaseStack

int size()

This a "getter" method without "get" in its name.

BaseStack

boolean isEmpty()

Try calling the int size() method when writing this.

ArrayStack

default constructor

Do not forget to call super(), and please initial the array so that its length is 3.

Then, compile and run the code using the provided interpreter script:

./compile_and_run.sh

You should see "PASS" printed on the screen multiple times. If you see "FAIL", don't panic, carefully read the error message and update your code. Once it compiles and you get all "PASS" messages from the tester, stage and commit your work to Git and then merge into the main branch with the following commands:

Warning

If you have placed Emacs into the background, then make sure that you have saved any files under src that are currently open to avoid accidentally adding backup files when adding and committing using Git.

git add src
git commit -m "Finished part 1"
git merge part2
Part 2: ArrayStack Push
Code Tracing 1

Draw a memory map for the code below on your exit ticket. Your diagram should include all variables (including instance variables) and objects created.

Stack stack = new ArrayStack();
stack.push("a");
Solution
Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:6 Stack stack: reference to object 1380 Heap object 1383: String@1383 (length 1) : "a" Heap object 1382: String[]@1382 (length 3) Index 0: reference to object 1383 Index 1: null Index 2: null Heap object 1380: ArrayStack@1380 String[] array: reference to object 1382 int size: 1{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:6","items":["Stack stack: reference to object 1380"]},{"heading":"Heap object 1383: String@1383 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1382: String[]@1382 (length 3)","items":["Index 0: reference to object 1383","Index 1: null","Index 2: null"]},{"heading":"Heap object 1380: ArrayStack@1380","items":["String[] array: reference to object 1382","int size: 1"]}]}main:6Stackstack1380String@1383 (length 1)"a"String[]@1382 (length 3)0121383nullnullArrayStack@1380String[]array1382intsize1

Final captured memory state. [download] [open]

Code Tracing 2

Draw a memory map for the code below on your exit ticket. Your diagram should include all variables (including instance variables) and objects created.

Stack stack = new ArrayStack();
stack.push("a");
stack.push("b");
stack.push("c");
Solution
Java program memory state. 1 stack frame; 2 heap objects.Stack frame: main:5 Stack stack: reference to object 1362 Heap object 1363: String[]@1363 (length 3) Index 0: null Index 1: null Index 2: null Heap object 1362: ArrayStack@1362 String[] array: reference to object 1363 int size: 0{"summary":"Java program memory state. 1 stack frame; 2 heap objects.","sections":[{"heading":"Stack frame: main:5","items":["Stack stack: reference to object 1362"]},{"heading":"Heap object 1363: String[]@1363 (length 3)","items":["Index 0: null","Index 1: null","Index 2: null"]},{"heading":"Heap object 1362: ArrayStack@1362","items":["String[] array: reference to object 1363","int size: 0"]}]}main:5Stackstack1362String[]@1363 (length 3)012nullnullnullArrayStack@1362String[]array1363intsize0

This shows ONE way to implement the ADT. Note: The debugger breakpoint is on line 5. [download] [open]

Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:6 Stack stack: reference to object 1362 Heap object 1364: String@1364 (length 1) : "a" Heap object 1363: String[]@1363 (length 3) Index 0: reference to object 1364 Index 1: null Index 2: null Heap object 1362: ArrayStack@1362 String[] array: reference to object 1363 int size: 1{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:6","items":["Stack stack: reference to object 1362"]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1363: String[]@1363 (length 3)","items":["Index 0: reference to object 1364","Index 1: null","Index 2: null"]},{"heading":"Heap object 1362: ArrayStack@1362","items":["String[] array: reference to object 1363","int size: 1"]}]}main:6Stackstack1362String@1364 (length 1)"a"String[]@1363 (length 3)0121364nullnullArrayStack@1362String[]array1363intsize1

This shows ONE way to implement the ADT. Note: The debugger breakpoint is on line 6. [download] [open]

Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:7 Stack stack: reference to object 1362 Heap object 1364: String@1364 (length 1) : "a" Heap object 1366: String@1366 (length 1) : "b" Heap object 1363: String[]@1363 (length 3) Index 0: reference to object 1364 Index 1: reference to object 1366 Index 2: null Heap object 1362: ArrayStack@1362 String[] array: reference to object 1363 int size: 2{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:7","items":["Stack stack: reference to object 1362"]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1366: String@1366 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1363: String[]@1363 (length 3)","items":["Index 0: reference to object 1364","Index 1: reference to object 1366","Index 2: null"]},{"heading":"Heap object 1362: ArrayStack@1362","items":["String[] array: reference to object 1363","int size: 2"]}]}main:7Stackstack1362String@1364 (length 1)"a"String@1366 (length 1)"b"String[]@1363 (length 3)01213641366nullArrayStack@1362String[]array1363intsize2

This shows ONE way to implement the ADT. Note: The debugger breakpoint is on line 7. [download] [open]

Java program memory state. 1 stack frame; 5 heap objects.Stack frame: main:8 Stack stack: reference to object 1362 Heap object 1364: String@1364 (length 1) : "a" Heap object 1366: String@1366 (length 1) : "b" Heap object 1368: String@1368 (length 1) : "c" Heap object 1363: String[]@1363 (length 3) Index 0: reference to object 1364 Index 1: reference to object 1366 Index 2: reference to object 1368 Heap object 1362: ArrayStack@1362 String[] array: reference to object 1363 int size: 3{"summary":"Java program memory state. 1 stack frame; 5 heap objects.","sections":[{"heading":"Stack frame: main:8","items":["Stack stack: reference to object 1362"]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1366: String@1366 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1368: String@1368 (length 1)","items":[": \"c\""]},{"heading":"Heap object 1363: String[]@1363 (length 3)","items":["Index 0: reference to object 1364","Index 1: reference to object 1366","Index 2: reference to object 1368"]},{"heading":"Heap object 1362: ArrayStack@1362","items":["String[] array: reference to object 1363","int size: 3"]}]}main:8Stackstack1362String@1364 (length 1)"a"String@1366 (length 1)"b"String@1368 (length 1)"c"String[]@1363 (length 3)012136413661368ArrayStack@1362String[]array1363intsize3

This shows ONE way to implement the ADT. Note: The debugger breakpoint is on line 8. [download] [open]

Code Tracing 3

Draw a memory map for the code below on your exit ticket. Your diagram should include all variables (including instance variables) and objects created.

Stack stack = new ArrayStack();
stack.push("a");
stack.push("b");
stack.push("c");
stack.push("d");
Solution
Java program memory state. 1 stack frame; 2 heap objects.Stack frame: main:5 Stack stack: reference to object 1382 Heap object 1383: String[]@1383 (length 3) Index 0: null Index 1: null Index 2: null Heap object 1382: ArrayStack@1382 String[] array: reference to object 1383 int size: 0{"summary":"Java program memory state. 1 stack frame; 2 heap objects.","sections":[{"heading":"Stack frame: main:5","items":["Stack stack: reference to object 1382"]},{"heading":"Heap object 1383: String[]@1383 (length 3)","items":["Index 0: null","Index 1: null","Index 2: null"]},{"heading":"Heap object 1382: ArrayStack@1382","items":["String[] array: reference to object 1383","int size: 0"]}]}main:5Stackstack1382String[]@1383 (length 3)012nullnullnullArrayStack@1382String[]array1383intsize0

This shows ONE way to implement the ADT. Note: The debugger breakpoint is on line 5. [download] [open]

Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:6 Stack stack: reference to object 1382 Heap object 1364: String@1364 (length 1) : "a" Heap object 1383: String[]@1383 (length 3) Index 0: reference to object 1364 Index 1: null Index 2: null Heap object 1382: ArrayStack@1382 String[] array: reference to object 1383 int size: 1{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:6","items":["Stack stack: reference to object 1382"]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1383: String[]@1383 (length 3)","items":["Index 0: reference to object 1364","Index 1: null","Index 2: null"]},{"heading":"Heap object 1382: ArrayStack@1382","items":["String[] array: reference to object 1383","int size: 1"]}]}main:6Stackstack1382String@1364 (length 1)"a"String[]@1383 (length 3)0121364nullnullArrayStack@1382String[]array1383intsize1

This shows ONE way to implement the ADT. Note: The debugger breakpoint is on line 6. [download] [open]

Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:7 Stack stack: reference to object 1382 Heap object 1364: String@1364 (length 1) : "a" Heap object 1366: String@1366 (length 1) : "b" Heap object 1383: String[]@1383 (length 3) Index 0: reference to object 1364 Index 1: reference to object 1366 Index 2: null Heap object 1382: ArrayStack@1382 String[] array: reference to object 1383 int size: 2{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:7","items":["Stack stack: reference to object 1382"]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1366: String@1366 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1383: String[]@1383 (length 3)","items":["Index 0: reference to object 1364","Index 1: reference to object 1366","Index 2: null"]},{"heading":"Heap object 1382: ArrayStack@1382","items":["String[] array: reference to object 1383","int size: 2"]}]}main:7Stackstack1382String@1364 (length 1)"a"String@1366 (length 1)"b"String[]@1383 (length 3)01213641366nullArrayStack@1382String[]array1383intsize2

This shows ONE way to implement the ADT. Note: The debugger breakpoint is on line 7. [download] [open]

Java program memory state. 1 stack frame; 5 heap objects.Stack frame: main:8 Stack stack: reference to object 1382 Heap object 1364: String@1364 (length 1) : "a" Heap object 1366: String@1366 (length 1) : "b" Heap object 1368: String@1368 (length 1) : "c" Heap object 1383: String[]@1383 (length 3) Index 0: reference to object 1364 Index 1: reference to object 1366 Index 2: reference to object 1368 Heap object 1382: ArrayStack@1382 String[] array: reference to object 1383 int size: 3{"summary":"Java program memory state. 1 stack frame; 5 heap objects.","sections":[{"heading":"Stack frame: main:8","items":["Stack stack: reference to object 1382"]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1366: String@1366 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1368: String@1368 (length 1)","items":[": \"c\""]},{"heading":"Heap object 1383: String[]@1383 (length 3)","items":["Index 0: reference to object 1364","Index 1: reference to object 1366","Index 2: reference to object 1368"]},{"heading":"Heap object 1382: ArrayStack@1382","items":["String[] array: reference to object 1383","int size: 3"]}]}main:8Stackstack1382String@1364 (length 1)"a"String@1366 (length 1)"b"String@1368 (length 1)"c"String[]@1383 (length 3)012136413661368ArrayStack@1382String[]array1383intsize3

This shows ONE way to implement the ADT. Note: The debugger breakpoint is on line 8. [download] [open]

Java program memory state. 1 stack frame; 6 heap objects.Stack frame: main:9 Stack stack: reference to object 1382 Heap object 1364: String@1364 (length 1) : "a" Heap object 1366: String@1366 (length 1) : "b" Heap object 1368: String@1368 (length 1) : "c" Heap object 1385: String@1385 (length 1) : "d" Heap object 1384: String[]@1384 (length 5) Index 0: reference to object 1364 Index 1: reference to object 1366 Index 2: reference to object 1368 Index 3: reference to object 1385 Index 4: null Heap object 1382: ArrayStack@1382 String[] array: reference to object 1384 int size: 4{"summary":"Java program memory state. 1 stack frame; 6 heap objects.","sections":[{"heading":"Stack frame: main:9","items":["Stack stack: reference to object 1382"]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1366: String@1366 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1368: String@1368 (length 1)","items":[": \"c\""]},{"heading":"Heap object 1385: String@1385 (length 1)","items":[": \"d\""]},{"heading":"Heap object 1384: String[]@1384 (length 5)","items":["Index 0: reference to object 1364","Index 1: reference to object 1366","Index 2: reference to object 1368","Index 3: reference to object 1385","Index 4: null"]},{"heading":"Heap object 1382: ArrayStack@1382","items":["String[] array: reference to object 1384","int size: 4"]}]}main:9Stackstack1382String@1364 (length 1)"a"String@1366 (length 1)"b"String@1368 (length 1)"c"String@1385 (length 1)"d"String[]@1384 (length 5)012341364136613681385nullArrayStack@1382String[]array1384intsize4

This shows ONE way to implement the ADT. Note: The debugger breakpoint is on line 9. [download] [open]

Discussion Opportunity

Should element 0 be the top of the stack or should the top be at the end of the array?

Inspecting the Tests

With your groups, inspect StackTester.java in the cs1302.test package.

Carefully review the new methods (stackTester03 through stackTester05) and answer the questions below:

  1. What are these methods testing?

  2. Why is stackTest05 needed?

Implementation

To pass the current set of tests, implement the following methods with your group:

In ArrayStack:

  • push

Then, compile and run the code using the provided script:

./compile_and_run.sh

You should see "PASS" printed on the screen multiple times. If you see "FAIL", don't panic, carefully read the error message and update your code. Once it compiles and you get all "PASS" messages from the tester, stage and commit your work to Git and then merge into the main branch with the following commands:

Listing 77 Commands to stage, commit, and merge
git add src
git commit -m "Finished part 2"
git merge part3
Part 3: ArrayStack Peek
Code Tracing

Write the expected output of the following code on your exit ticket:

Stack stack = new ArrayStack();
stack.push("a");
stack.push("b");
stack.push("c");
stack.push("d");
System.out.println(stack.peek());
System.out.println(stack.peek());
System.out.println(stack.peek());
Solution

The output will be:

d
d
d
Inspecting the Tests

With your groups, inspect StackTester.java in the cs1302.test package.

Carefully review the new methods (stackTester06 through stackTester08) and answer the questions below:

  1. What are these methods testing?

  2. Can you think of any additional tests that might be beneficial?

Implementation

To pass the current set of tests, implement the following methods with your group:

In ArrayStack:

  • peek

Then, compile and run the code using the provided script:

./compile_and_run.sh

You should see "PASS" printed on the screen multiple times. If you see "FAIL", don't panic, carefully read the error message and update your code. Once it compiles and you get all "PASS" messages from the tester, stage and commit your work to Git and then merge into the main branch with the following commands:

Listing 78 Commands to stage, commit, and merge
git add src
git commit -m "Finished part 3"
git merge part4
Part 4: ArrayStack Pop
Code Tracing

Draw a memory map for the code below on your exit ticket. Use the memory map from the last part as a starting point. Your diagram should include all variables (including instance variables) and objects created.

Stack stack = new ArrayStack();
stack.push("a");
stack.push("b");
stack.push("c");
stack.push("d");
System.out.println(stack.peek());
System.out.println(stack.pop());
System.out.println(stack.pop());
Solution
Java program memory state. 1 stack frame; 2 heap objects.Stack frame: main:5 Stack stack: reference to object 1397 Heap object 1398: String[]@1398 (length 3) Index 0: null Index 1: null Index 2: null Heap object 1397: ArrayStack@1397 String[] array: reference to object 1398 int size: 0{"summary":"Java program memory state. 1 stack frame; 2 heap objects.","sections":[{"heading":"Stack frame: main:5","items":["Stack stack: reference to object 1397"]},{"heading":"Heap object 1398: String[]@1398 (length 3)","items":["Index 0: null","Index 1: null","Index 2: null"]},{"heading":"Heap object 1397: ArrayStack@1397","items":["String[] array: reference to object 1398","int size: 0"]}]}main:5Stackstack1397String[]@1398 (length 3)012nullnullnullArrayStack@1397String[]array1398intsize0

Memory state at the breakpoint on line 5. [download] [open]

Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:6 Stack stack: reference to object 1397 Heap object 1383: String@1383 (length 1) : "a" Heap object 1398: String[]@1398 (length 3) Index 0: reference to object 1383 Index 1: null Index 2: null Heap object 1397: ArrayStack@1397 String[] array: reference to object 1398 int size: 1{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:6","items":["Stack stack: reference to object 1397"]},{"heading":"Heap object 1383: String@1383 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1398: String[]@1398 (length 3)","items":["Index 0: reference to object 1383","Index 1: null","Index 2: null"]},{"heading":"Heap object 1397: ArrayStack@1397","items":["String[] array: reference to object 1398","int size: 1"]}]}main:6Stackstack1397String@1383 (length 1)"a"String[]@1398 (length 3)0121383nullnullArrayStack@1397String[]array1398intsize1

Memory state at the breakpoint on line 6. [download] [open]

Java program memory state. 1 stack frame; 4 heap objects.Stack frame: main:7 Stack stack: reference to object 1397 Heap object 1383: String@1383 (length 1) : "a" Heap object 1399: String@1399 (length 1) : "b" Heap object 1398: String[]@1398 (length 3) Index 0: reference to object 1383 Index 1: reference to object 1399 Index 2: null Heap object 1397: ArrayStack@1397 String[] array: reference to object 1398 int size: 2{"summary":"Java program memory state. 1 stack frame; 4 heap objects.","sections":[{"heading":"Stack frame: main:7","items":["Stack stack: reference to object 1397"]},{"heading":"Heap object 1383: String@1383 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1399: String@1399 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1398: String[]@1398 (length 3)","items":["Index 0: reference to object 1383","Index 1: reference to object 1399","Index 2: null"]},{"heading":"Heap object 1397: ArrayStack@1397","items":["String[] array: reference to object 1398","int size: 2"]}]}main:7Stackstack1397String@1383 (length 1)"a"String@1399 (length 1)"b"String[]@1398 (length 3)01213831399nullArrayStack@1397String[]array1398intsize2

Memory state at the breakpoint on line 7. [download] [open]

Java program memory state. 1 stack frame; 5 heap objects.Stack frame: main:8 Stack stack: reference to object 1397 Heap object 1383: String@1383 (length 1) : "a" Heap object 1399: String@1399 (length 1) : "b" Heap object 1401: String@1401 (length 1) : "c" Heap object 1398: String[]@1398 (length 3) Index 0: reference to object 1383 Index 1: reference to object 1399 Index 2: reference to object 1401 Heap object 1397: ArrayStack@1397 String[] array: reference to object 1398 int size: 3{"summary":"Java program memory state. 1 stack frame; 5 heap objects.","sections":[{"heading":"Stack frame: main:8","items":["Stack stack: reference to object 1397"]},{"heading":"Heap object 1383: String@1383 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1399: String@1399 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1401: String@1401 (length 1)","items":[": \"c\""]},{"heading":"Heap object 1398: String[]@1398 (length 3)","items":["Index 0: reference to object 1383","Index 1: reference to object 1399","Index 2: reference to object 1401"]},{"heading":"Heap object 1397: ArrayStack@1397","items":["String[] array: reference to object 1398","int size: 3"]}]}main:8Stackstack1397String@1383 (length 1)"a"String@1399 (length 1)"b"String@1401 (length 1)"c"String[]@1398 (length 3)012138313991401ArrayStack@1397String[]array1398intsize3

Memory state at the breakpoint on line 8. [download] [open]

Java program memory state. 1 stack frame; 6 heap objects.Stack frame: main:9 Stack stack: reference to object 1397 Heap object 1383: String@1383 (length 1) : "a" Heap object 1399: String@1399 (length 1) : "b" Heap object 1401: String@1401 (length 1) : "c" Heap object 1404: String@1404 (length 1) : "d" Heap object 1403: String[]@1403 (length 5) Index 0: reference to object 1383 Index 1: reference to object 1399 Index 2: reference to object 1401 Index 3: reference to object 1404 Index 4: null Heap object 1397: ArrayStack@1397 String[] array: reference to object 1403 int size: 4{"summary":"Java program memory state. 1 stack frame; 6 heap objects.","sections":[{"heading":"Stack frame: main:9","items":["Stack stack: reference to object 1397"]},{"heading":"Heap object 1383: String@1383 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1399: String@1399 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1401: String@1401 (length 1)","items":[": \"c\""]},{"heading":"Heap object 1404: String@1404 (length 1)","items":[": \"d\""]},{"heading":"Heap object 1403: String[]@1403 (length 5)","items":["Index 0: reference to object 1383","Index 1: reference to object 1399","Index 2: reference to object 1401","Index 3: reference to object 1404","Index 4: null"]},{"heading":"Heap object 1397: ArrayStack@1397","items":["String[] array: reference to object 1403","int size: 4"]}]}main:9Stackstack1397String@1383 (length 1)"a"String@1399 (length 1)"b"String@1401 (length 1)"c"String@1404 (length 1)"d"String[]@1403 (length 5)012341383139914011404nullArrayStack@1397String[]array1403intsize4

Memory state at the breakpoint on line 9. [download] [open]

Java program memory state. 1 stack frame; 6 heap objects.Stack frame: main:10 Stack stack: reference to object 1397 Heap object 1383: String@1383 (length 1) : "a" Heap object 1399: String@1399 (length 1) : "b" Heap object 1401: String@1401 (length 1) : "c" Heap object 1404: String@1404 (length 1) : "d" Heap object 1403: String[]@1403 (length 5) Index 0: reference to object 1383 Index 1: reference to object 1399 Index 2: reference to object 1401 Index 3: reference to object 1404 Index 4: null Heap object 1397: ArrayStack@1397 String[] array: reference to object 1403 int size: 4{"summary":"Java program memory state. 1 stack frame; 6 heap objects.","sections":[{"heading":"Stack frame: main:10","items":["Stack stack: reference to object 1397"]},{"heading":"Heap object 1383: String@1383 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1399: String@1399 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1401: String@1401 (length 1)","items":[": \"c\""]},{"heading":"Heap object 1404: String@1404 (length 1)","items":[": \"d\""]},{"heading":"Heap object 1403: String[]@1403 (length 5)","items":["Index 0: reference to object 1383","Index 1: reference to object 1399","Index 2: reference to object 1401","Index 3: reference to object 1404","Index 4: null"]},{"heading":"Heap object 1397: ArrayStack@1397","items":["String[] array: reference to object 1403","int size: 4"]}]}main:10Stackstack1397String@1383 (length 1)"a"String@1399 (length 1)"b"String@1401 (length 1)"c"String@1404 (length 1)"d"String[]@1403 (length 5)012341383139914011404nullArrayStack@1397String[]array1403intsize4

Memory state at the breakpoint on line 10. [download] [open]

Java program memory state. 1 stack frame; 6 heap objects.Stack frame: main:11 Stack stack: reference to object 1397 Heap object 1383: String@1383 (length 1) : "a" Heap object 1399: String@1399 (length 1) : "b" Heap object 1401: String@1401 (length 1) : "c" Heap object 1404: String@1404 (length 1) : "d" Heap object 1403: String[]@1403 (length 5) Index 0: reference to object 1383 Index 1: reference to object 1399 Index 2: reference to object 1401 Index 3: reference to object 1404 Index 4: null Heap object 1397: ArrayStack@1397 String[] array: reference to object 1403 int size: 3{"summary":"Java program memory state. 1 stack frame; 6 heap objects.","sections":[{"heading":"Stack frame: main:11","items":["Stack stack: reference to object 1397"]},{"heading":"Heap object 1383: String@1383 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1399: String@1399 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1401: String@1401 (length 1)","items":[": \"c\""]},{"heading":"Heap object 1404: String@1404 (length 1)","items":[": \"d\""]},{"heading":"Heap object 1403: String[]@1403 (length 5)","items":["Index 0: reference to object 1383","Index 1: reference to object 1399","Index 2: reference to object 1401","Index 3: reference to object 1404","Index 4: null"]},{"heading":"Heap object 1397: ArrayStack@1397","items":["String[] array: reference to object 1403","int size: 3"]}]}main:11Stackstack1397String@1383 (length 1)"a"String@1399 (length 1)"b"String@1401 (length 1)"c"String@1404 (length 1)"d"String[]@1403 (length 5)012341383139914011404nullArrayStack@1397String[]array1403intsize3

Memory state at the breakpoint on line 11. [download] [open]

Java program memory state. 1 stack frame; 6 heap objects.Stack frame: main:12 Stack stack: reference to object 1397 Heap object 1383: String@1383 (length 1) : "a" Heap object 1399: String@1399 (length 1) : "b" Heap object 1401: String@1401 (length 1) : "c" Heap object 1404: String@1404 (length 1) : "d" Heap object 1403: String[]@1403 (length 5) Index 0: reference to object 1383 Index 1: reference to object 1399 Index 2: reference to object 1401 Index 3: reference to object 1404 Index 4: null Heap object 1397: ArrayStack@1397 String[] array: reference to object 1403 int size: 2{"summary":"Java program memory state. 1 stack frame; 6 heap objects.","sections":[{"heading":"Stack frame: main:12","items":["Stack stack: reference to object 1397"]},{"heading":"Heap object 1383: String@1383 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1399: String@1399 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1401: String@1401 (length 1)","items":[": \"c\""]},{"heading":"Heap object 1404: String@1404 (length 1)","items":[": \"d\""]},{"heading":"Heap object 1403: String[]@1403 (length 5)","items":["Index 0: reference to object 1383","Index 1: reference to object 1399","Index 2: reference to object 1401","Index 3: reference to object 1404","Index 4: null"]},{"heading":"Heap object 1397: ArrayStack@1397","items":["String[] array: reference to object 1403","int size: 2"]}]}main:12Stackstack1397String@1383 (length 1)"a"String@1399 (length 1)"b"String@1401 (length 1)"c"String@1404 (length 1)"d"String[]@1403 (length 5)012341383139914011404nullArrayStack@1397String[]array1403intsize2

Memory state at the breakpoint on line 12. [download] [open]

Discussion Opportunity

Should we mark the elements null within the array when we remove from the stack?

Inspecting the Tests

With your groups, inspect StackTester.java in the cs1302.test package.

Carefully review the new methods (stackTester09 through stackTester17) and answer the questions below:

  1. What are these methods testing?

  2. Can you think of any other tests that might be beneficial to add?

Implementation

To pass the current set of tests, implement the following methods with your group:

In ArrayStack:

  • pop

Then, compile and run the code using the provided script:

./compile_and_run.sh

You should see "PASS" printed on the screen multiple times. If you see "FAIL", don't panic, carefully read the error message and update your code. Once it compiles and you get all "PASS" messages from the tester, stage and commit your work to Git and then merge into the main branch with the following commands:

Listing 79 Commands to stage, commit, and merge
git add src
git commit -m "Finished part 4"
git merge part5
Part 5: ArrayStack Additional Testing
Inspecting the Tests

With your groups, inspect StackTester.java in the cs1302.test package.

Carefully review the new methods (stackTester18 through stackTester20) and answer the questions below:

  1. What are these methods testing?

  2. What other tests might be beneficial?

Implementation

To pass the current set of tests, make sure you are throwing the appropriate exceptions within your ArrayStack implementations.

Then, compile and run the code using the provided script:

./compile_and_run.sh

You should see "PASS" printed on the screen multiple times. If you see "FAIL", don't panic, carefully read the error message and update your code. Once it compiles and you get all "PASS" messages from the tester, stage and commit your work to Git and then merge into the main branch with the following commands:

Listing 80 Commands to stage, commit, and merge
git add src
git commit -m "Finished part 5"
Part 6: LinkedStack Constructor
Code Tracing

Draw a memory map for the code below on your exit ticket. Your diagram should include all variables (including instance variables) and objects created.

Stack stack = new LinkedStack();
Solution
Java program memory state. 1 stack frame; 1 heap object.Stack frame: main:5 Stack stack: reference to object 1418 Heap object 1418: LinkedStack@1418 Node head: null int size: 0{"summary":"Java program memory state. 1 stack frame; 1 heap object.","sections":[{"heading":"Stack frame: main:5","items":["Stack stack: reference to object 1418"]},{"heading":"Heap object 1418: LinkedStack@1418","items":["Node head: null","int size: 0"]}]}main:5Stackstack1418LinkedStack@1418Nodeheadnullintsize0

Final captured memory state. [download] [open]

Implementation

Implement the following methods with your group:

In LinkedStack:

  • Constructor

Inspecting the Tests

With your groups, inspect StackTester.java in the cs1302.test package and answer the following questions:

  1. How do we reuse this code to test our LinkedStack implementation?

  2. How many methods should we expect to pass after implementing the LinkedStack constructor?

Compile and Run

Compile and run the code using the provided script:

./compile_and_run.sh

You should see "PASS" printed on the screen for the first few tests and then an exception for the next method we need to implement. If you see "FAIL", don't panic, carefully read the error message and update your code. Once it compiles and you get all "PASS" messages from the tester, stage and commit your work to Git and then merge into the main branch with the following commands:

Listing 81 Commands to stage, commit, and merge
git add src
git commit -m "Finished part 6"
Part 7: LinkedStack Push
Code Tracing 1

Draw a memory map for the code below on your exit ticket. Your diagram should include all variables (including instance variables) and objects created.

Stack stack = new LinkedStack();
stack.push("a");
Solution
Java program memory state. 1 stack frame; 1 heap object.Stack frame: main:5 Stack stack: reference to object 1399 Heap object 1399: LinkedStack@1399 Node head: null int size: 0{"summary":"Java program memory state. 1 stack frame; 1 heap object.","sections":[{"heading":"Stack frame: main:5","items":["Stack stack: reference to object 1399"]},{"heading":"Heap object 1399: LinkedStack@1399","items":["Node head: null","int size: 0"]}]}main:5Stackstack1399LinkedStack@1399Nodeheadnullintsize0

Memory state at the breakpoint on line 5. [download] [open]

Code Tracing 2

Draw a memory map for the code below on your exit ticket. Your diagram should include all variables (including instance variables) and objects created.

Stack stack = new LinkedStack();
stack.push("a");
stack.push("b");
stack.push("c");
Solution
Java program memory state. 1 stack frame; 1 heap object.Stack frame: main:5 Stack stack: reference to object 1431 Heap object 1431: LinkedStack@1431 Node head: null int size: 0{"summary":"Java program memory state. 1 stack frame; 1 heap object.","sections":[{"heading":"Stack frame: main:5","items":["Stack stack: reference to object 1431"]},{"heading":"Heap object 1431: LinkedStack@1431","items":["Node head: null","int size: 0"]}]}main:5Stackstack1431LinkedStack@1431Nodeheadnullintsize0

This is ONE possible implementation of the ADT. Note: The debugger breakpoint is on line 5. [download] [open]

Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:6 Stack stack: reference to object 1431 Heap object 1383: String@1383 (length 1) : "a" Heap object 1433: Node@1433 String item: reference to object 1383 Node next: null Heap object 1431: LinkedStack@1431 Node head: reference to object 1433 int size: 1{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:6","items":["Stack stack: reference to object 1431"]},{"heading":"Heap object 1383: String@1383 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1433: Node@1433","items":["String item: reference to object 1383","Node next: null"]},{"heading":"Heap object 1431: LinkedStack@1431","items":["Node head: reference to object 1433","int size: 1"]}]}main:6Stackstack1431String@1383 (length 1)"a"Node@1433Stringitem1383NodenextnullLinkedStack@1431Nodehead1433intsize1

This is ONE possible implementation of the ADT. Note: The debugger breakpoint is on line 6. [download] [open]

Java program memory state. 1 stack frame; 5 heap objects.Stack frame: main:7 Stack stack: reference to object 1431 Heap object 1399: String@1399 (length 1) : "b" Heap object 1383: String@1383 (length 1) : "a" Heap object 1434: Node@1434 String item: reference to object 1399 Node next: reference to object 1433 Heap object 1433: Node@1433 String item: reference to object 1383 Node next: null Heap object 1431: LinkedStack@1431 Node head: reference to object 1434 int size: 2{"summary":"Java program memory state. 1 stack frame; 5 heap objects.","sections":[{"heading":"Stack frame: main:7","items":["Stack stack: reference to object 1431"]},{"heading":"Heap object 1399: String@1399 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1383: String@1383 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1434: Node@1434","items":["String item: reference to object 1399","Node next: reference to object 1433"]},{"heading":"Heap object 1433: Node@1433","items":["String item: reference to object 1383","Node next: null"]},{"heading":"Heap object 1431: LinkedStack@1431","items":["Node head: reference to object 1434","int size: 2"]}]}main:7Stackstack1431String@1399 (length 1)"b"String@1383 (length 1)"a"Node@1434Stringitem1399Nodenext1433Node@1433Stringitem1383NodenextnullLinkedStack@1431Nodehead1434intsize2

This is ONE possible implementation of the ADT. Note: The debugger breakpoint is on line 7. [download] [open]

Java program memory state. 1 stack frame; 7 heap objects.Stack frame: main:8 Stack stack: reference to object 1431 Heap object 1401: String@1401 (length 1) : "c" Heap object 1399: String@1399 (length 1) : "b" Heap object 1383: String@1383 (length 1) : "a" Heap object 1435: Node@1435 String item: reference to object 1401 Node next: reference to object 1434 Heap object 1434: Node@1434 String item: reference to object 1399 Node next: reference to object 1433 Heap object 1433: Node@1433 String item: reference to object 1383 Node next: null Heap object 1431: LinkedStack@1431 Node head: reference to object 1435 int size: 3{"summary":"Java program memory state. 1 stack frame; 7 heap objects.","sections":[{"heading":"Stack frame: main:8","items":["Stack stack: reference to object 1431"]},{"heading":"Heap object 1401: String@1401 (length 1)","items":[": \"c\""]},{"heading":"Heap object 1399: String@1399 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1383: String@1383 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1435: Node@1435","items":["String item: reference to object 1401","Node next: reference to object 1434"]},{"heading":"Heap object 1434: Node@1434","items":["String item: reference to object 1399","Node next: reference to object 1433"]},{"heading":"Heap object 1433: Node@1433","items":["String item: reference to object 1383","Node next: null"]},{"heading":"Heap object 1431: LinkedStack@1431","items":["Node head: reference to object 1435","int size: 3"]}]}main:8Stackstack1431String@1401 (length 1)"c"String@1399 (length 1)"b"String@1383 (length 1)"a"Node@1435Stringitem1401Nodenext1434Node@1434Stringitem1399Nodenext1433Node@1433Stringitem1383NodenextnullLinkedStack@1431Nodehead1435intsize3

This is ONE possible implementation of the ADT. Note: The debugger breakpoint is on line 8. [download] [open]

Code Tracing 3

Draw a memory map for the code below on your exit ticket. Your diagram should include all variables (including instance variables) and objects created.

Stack stack = new LinkedStack();
stack.push("a");
stack.push("b");
stack.push("c");
stack.push("d");
Solution
Java program memory state. 1 stack frame; 1 heap object.Stack frame: main:5 Stack stack: reference to object 1413 Heap object 1413: LinkedStack@1413 Node head: null int size: 0{"summary":"Java program memory state. 1 stack frame; 1 heap object.","sections":[{"heading":"Stack frame: main:5","items":["Stack stack: reference to object 1413"]},{"heading":"Heap object 1413: LinkedStack@1413","items":["Node head: null","int size: 0"]}]}main:5Stackstack1413LinkedStack@1413Nodeheadnullintsize0

Memory state at the breakpoint on line 5. [download] [open]

Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:6 Stack stack: reference to object 1413 Heap object 1364: String@1364 (length 1) : "a" Heap object 1415: Node@1415 String item: reference to object 1364 Node next: null Heap object 1413: LinkedStack@1413 Node head: reference to object 1415 int size: 1{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:6","items":["Stack stack: reference to object 1413"]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1415: Node@1415","items":["String item: reference to object 1364","Node next: null"]},{"heading":"Heap object 1413: LinkedStack@1413","items":["Node head: reference to object 1415","int size: 1"]}]}main:6Stackstack1413String@1364 (length 1)"a"Node@1415Stringitem1364NodenextnullLinkedStack@1413Nodehead1415intsize1

Memory state at the breakpoint on line 6. [download] [open]

Java program memory state. 1 stack frame; 5 heap objects.Stack frame: main:7 Stack stack: reference to object 1413 Heap object 1366: String@1366 (length 1) : "b" Heap object 1364: String@1364 (length 1) : "a" Heap object 1416: Node@1416 String item: reference to object 1366 Node next: reference to object 1415 Heap object 1415: Node@1415 String item: reference to object 1364 Node next: null Heap object 1413: LinkedStack@1413 Node head: reference to object 1416 int size: 2{"summary":"Java program memory state. 1 stack frame; 5 heap objects.","sections":[{"heading":"Stack frame: main:7","items":["Stack stack: reference to object 1413"]},{"heading":"Heap object 1366: String@1366 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1416: Node@1416","items":["String item: reference to object 1366","Node next: reference to object 1415"]},{"heading":"Heap object 1415: Node@1415","items":["String item: reference to object 1364","Node next: null"]},{"heading":"Heap object 1413: LinkedStack@1413","items":["Node head: reference to object 1416","int size: 2"]}]}main:7Stackstack1413String@1366 (length 1)"b"String@1364 (length 1)"a"Node@1416Stringitem1366Nodenext1415Node@1415Stringitem1364NodenextnullLinkedStack@1413Nodehead1416intsize2

Memory state at the breakpoint on line 7. [download] [open]

Java program memory state. 1 stack frame; 7 heap objects.Stack frame: main:8 Stack stack: reference to object 1413 Heap object 1368: String@1368 (length 1) : "c" Heap object 1366: String@1366 (length 1) : "b" Heap object 1364: String@1364 (length 1) : "a" Heap object 1417: Node@1417 String item: reference to object 1368 Node next: reference to object 1416 Heap object 1416: Node@1416 String item: reference to object 1366 Node next: reference to object 1415 Heap object 1415: Node@1415 String item: reference to object 1364 Node next: null Heap object 1413: LinkedStack@1413 Node head: reference to object 1417 int size: 3{"summary":"Java program memory state. 1 stack frame; 7 heap objects.","sections":[{"heading":"Stack frame: main:8","items":["Stack stack: reference to object 1413"]},{"heading":"Heap object 1368: String@1368 (length 1)","items":[": \"c\""]},{"heading":"Heap object 1366: String@1366 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1417: Node@1417","items":["String item: reference to object 1368","Node next: reference to object 1416"]},{"heading":"Heap object 1416: Node@1416","items":["String item: reference to object 1366","Node next: reference to object 1415"]},{"heading":"Heap object 1415: Node@1415","items":["String item: reference to object 1364","Node next: null"]},{"heading":"Heap object 1413: LinkedStack@1413","items":["Node head: reference to object 1417","int size: 3"]}]}main:8Stackstack1413String@1368 (length 1)"c"String@1366 (length 1)"b"String@1364 (length 1)"a"Node@1417Stringitem1368Nodenext1416Node@1416Stringitem1366Nodenext1415Node@1415Stringitem1364NodenextnullLinkedStack@1413Nodehead1417intsize3

Memory state at the breakpoint on line 8. [download] [open]

Java program memory state. 1 stack frame; 9 heap objects.Stack frame: main:9 Stack stack: reference to object 1413 Heap object 1385: String@1385 (length 1) : "d" Heap object 1368: String@1368 (length 1) : "c" Heap object 1366: String@1366 (length 1) : "b" Heap object 1364: String@1364 (length 1) : "a" Heap object 1418: Node@1418 String item: reference to object 1385 Node next: reference to object 1417 Heap object 1417: Node@1417 String item: reference to object 1368 Node next: reference to object 1416 Heap object 1416: Node@1416 String item: reference to object 1366 Node next: reference to object 1415 Heap object 1415: Node@1415 String item: reference to object 1364 Node next: null Heap object 1413: LinkedStack@1413 Node head: reference to object 1418 int size: 4{"summary":"Java program memory state. 1 stack frame; 9 heap objects.","sections":[{"heading":"Stack frame: main:9","items":["Stack stack: reference to object 1413"]},{"heading":"Heap object 1385: String@1385 (length 1)","items":[": \"d\""]},{"heading":"Heap object 1368: String@1368 (length 1)","items":[": \"c\""]},{"heading":"Heap object 1366: String@1366 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1418: Node@1418","items":["String item: reference to object 1385","Node next: reference to object 1417"]},{"heading":"Heap object 1417: Node@1417","items":["String item: reference to object 1368","Node next: reference to object 1416"]},{"heading":"Heap object 1416: Node@1416","items":["String item: reference to object 1366","Node next: reference to object 1415"]},{"heading":"Heap object 1415: Node@1415","items":["String item: reference to object 1364","Node next: null"]},{"heading":"Heap object 1413: LinkedStack@1413","items":["Node head: reference to object 1418","int size: 4"]}]}main:9Stackstack1413String@1385 (length 1)"d"String@1368 (length 1)"c"String@1366 (length 1)"b"String@1364 (length 1)"a"Node@1418Stringitem1385Nodenext1417Node@1417Stringitem1368Nodenext1416Node@1416Stringitem1366Nodenext1415Node@1415Stringitem1364NodenextnullLinkedStack@1413Nodehead1418intsize4

Memory state at the breakpoint on line 9. [download] [open]

Discussion Opportunity

Should head be the top of the stack or should the end of the list be the top?

Implementation

Implement the following methods with your group:

In LinkedStack:

  • push

Inspecting the Tests

With your groups, inspect StackTester.java in the cs1302.test package and answer the following question:

  1. How many methods should we expect to pass after implementing the LinkedStack constructor?

Compile and Run

Compile and run the code using the provided script:

./compile_and_run.sh

You should see "PASS" printed on the screen for the first few tests and then an exception for the next method we need to implement. If you see "FAIL", don't panic, carefully read the error message and update your code. Once it compiles and you get all "PASS" messages from the tester, stage and commit your work to Git and then merge into the main branch with the following commands:

Listing 82 Commands to stage, commit, and merge
git add src
git commit -m "Finished part 7"
Part 8: LinkedStack Peek and Pop
Code Tracing

Draw a memory map for the code below on your exit ticket. Use the memory map from the last part as a starting point. Your diagram should include all variables (including instance variables) and objects created.

Stack stack = new LinkedStack();
stack.push("a");
stack.push("b");
stack.push("c");
stack.push("d");
System.out.println(stack.peek());
System.out.println(stack.pop());
System.out.println(stack.pop());
Solution
Java program memory state. 1 stack frame; 1 heap object.Stack frame: main:5 Stack stack: reference to object 1431 Heap object 1431: LinkedStack@1431 Node head: null int size: 0{"summary":"Java program memory state. 1 stack frame; 1 heap object.","sections":[{"heading":"Stack frame: main:5","items":["Stack stack: reference to object 1431"]},{"heading":"Heap object 1431: LinkedStack@1431","items":["Node head: null","int size: 0"]}]}main:5Stackstack1431LinkedStack@1431Nodeheadnullintsize0

This is ONE possible implementation of the ADT. Note: The debugger breakpoint is on line 5. [download] [open]

Java program memory state. 1 stack frame; 3 heap objects.Stack frame: main:6 Stack stack: reference to object 1431 Heap object 1364: String@1364 (length 1) : "a" Heap object 1433: Node@1433 String item: reference to object 1364 Node next: null Heap object 1431: LinkedStack@1431 Node head: reference to object 1433 int size: 1{"summary":"Java program memory state. 1 stack frame; 3 heap objects.","sections":[{"heading":"Stack frame: main:6","items":["Stack stack: reference to object 1431"]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1433: Node@1433","items":["String item: reference to object 1364","Node next: null"]},{"heading":"Heap object 1431: LinkedStack@1431","items":["Node head: reference to object 1433","int size: 1"]}]}main:6Stackstack1431String@1364 (length 1)"a"Node@1433Stringitem1364NodenextnullLinkedStack@1431Nodehead1433intsize1

This is ONE possible implementation of the ADT. Note: The debugger breakpoint is on line 6. [download] [open]

Java program memory state. 1 stack frame; 5 heap objects.Stack frame: main:7 Stack stack: reference to object 1431 Heap object 1366: String@1366 (length 1) : "b" Heap object 1364: String@1364 (length 1) : "a" Heap object 1434: Node@1434 String item: reference to object 1366 Node next: reference to object 1433 Heap object 1433: Node@1433 String item: reference to object 1364 Node next: null Heap object 1431: LinkedStack@1431 Node head: reference to object 1434 int size: 2{"summary":"Java program memory state. 1 stack frame; 5 heap objects.","sections":[{"heading":"Stack frame: main:7","items":["Stack stack: reference to object 1431"]},{"heading":"Heap object 1366: String@1366 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1434: Node@1434","items":["String item: reference to object 1366","Node next: reference to object 1433"]},{"heading":"Heap object 1433: Node@1433","items":["String item: reference to object 1364","Node next: null"]},{"heading":"Heap object 1431: LinkedStack@1431","items":["Node head: reference to object 1434","int size: 2"]}]}main:7Stackstack1431String@1366 (length 1)"b"String@1364 (length 1)"a"Node@1434Stringitem1366Nodenext1433Node@1433Stringitem1364NodenextnullLinkedStack@1431Nodehead1434intsize2

This is ONE possible implementation of the ADT. Note: The debugger breakpoint is on line 7. [download] [open]

Java program memory state. 1 stack frame; 7 heap objects.Stack frame: main:8 Stack stack: reference to object 1431 Heap object 1368: String@1368 (length 1) : "c" Heap object 1366: String@1366 (length 1) : "b" Heap object 1364: String@1364 (length 1) : "a" Heap object 1435: Node@1435 String item: reference to object 1368 Node next: reference to object 1434 Heap object 1434: Node@1434 String item: reference to object 1366 Node next: reference to object 1433 Heap object 1433: Node@1433 String item: reference to object 1364 Node next: null Heap object 1431: LinkedStack@1431 Node head: reference to object 1435 int size: 3{"summary":"Java program memory state. 1 stack frame; 7 heap objects.","sections":[{"heading":"Stack frame: main:8","items":["Stack stack: reference to object 1431"]},{"heading":"Heap object 1368: String@1368 (length 1)","items":[": \"c\""]},{"heading":"Heap object 1366: String@1366 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1435: Node@1435","items":["String item: reference to object 1368","Node next: reference to object 1434"]},{"heading":"Heap object 1434: Node@1434","items":["String item: reference to object 1366","Node next: reference to object 1433"]},{"heading":"Heap object 1433: Node@1433","items":["String item: reference to object 1364","Node next: null"]},{"heading":"Heap object 1431: LinkedStack@1431","items":["Node head: reference to object 1435","int size: 3"]}]}main:8Stackstack1431String@1368 (length 1)"c"String@1366 (length 1)"b"String@1364 (length 1)"a"Node@1435Stringitem1368Nodenext1434Node@1434Stringitem1366Nodenext1433Node@1433Stringitem1364NodenextnullLinkedStack@1431Nodehead1435intsize3

This is ONE possible implementation of the ADT. Note: The debugger breakpoint is on line 8. [download] [open]

Java program memory state. 1 stack frame; 9 heap objects.Stack frame: main:9 Stack stack: reference to object 1431 Heap object 1385: String@1385 (length 1) : "d" Heap object 1368: String@1368 (length 1) : "c" Heap object 1366: String@1366 (length 1) : "b" Heap object 1364: String@1364 (length 1) : "a" Heap object 1436: Node@1436 String item: reference to object 1385 Node next: reference to object 1435 Heap object 1435: Node@1435 String item: reference to object 1368 Node next: reference to object 1434 Heap object 1434: Node@1434 String item: reference to object 1366 Node next: reference to object 1433 Heap object 1433: Node@1433 String item: reference to object 1364 Node next: null Heap object 1431: LinkedStack@1431 Node head: reference to object 1436 int size: 4{"summary":"Java program memory state. 1 stack frame; 9 heap objects.","sections":[{"heading":"Stack frame: main:9","items":["Stack stack: reference to object 1431"]},{"heading":"Heap object 1385: String@1385 (length 1)","items":[": \"d\""]},{"heading":"Heap object 1368: String@1368 (length 1)","items":[": \"c\""]},{"heading":"Heap object 1366: String@1366 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1436: Node@1436","items":["String item: reference to object 1385","Node next: reference to object 1435"]},{"heading":"Heap object 1435: Node@1435","items":["String item: reference to object 1368","Node next: reference to object 1434"]},{"heading":"Heap object 1434: Node@1434","items":["String item: reference to object 1366","Node next: reference to object 1433"]},{"heading":"Heap object 1433: Node@1433","items":["String item: reference to object 1364","Node next: null"]},{"heading":"Heap object 1431: LinkedStack@1431","items":["Node head: reference to object 1436","int size: 4"]}]}main:9Stackstack1431String@1385 (length 1)"d"String@1368 (length 1)"c"String@1366 (length 1)"b"String@1364 (length 1)"a"Node@1436Stringitem1385Nodenext1435Node@1435Stringitem1368Nodenext1434Node@1434Stringitem1366Nodenext1433Node@1433Stringitem1364NodenextnullLinkedStack@1431Nodehead1436intsize4

This is ONE possible implementation of the ADT. Note: The debugger breakpoint is on line 9. [download] [open]

Java program memory state. 1 stack frame; 9 heap objects.Stack frame: main:10 Stack stack: reference to object 1431 Heap object 1385: String@1385 (length 1) : "d" Heap object 1368: String@1368 (length 1) : "c" Heap object 1366: String@1366 (length 1) : "b" Heap object 1364: String@1364 (length 1) : "a" Heap object 1436: Node@1436 String item: reference to object 1385 Node next: reference to object 1435 Heap object 1435: Node@1435 String item: reference to object 1368 Node next: reference to object 1434 Heap object 1434: Node@1434 String item: reference to object 1366 Node next: reference to object 1433 Heap object 1433: Node@1433 String item: reference to object 1364 Node next: null Heap object 1431: LinkedStack@1431 Node head: reference to object 1436 int size: 4{"summary":"Java program memory state. 1 stack frame; 9 heap objects.","sections":[{"heading":"Stack frame: main:10","items":["Stack stack: reference to object 1431"]},{"heading":"Heap object 1385: String@1385 (length 1)","items":[": \"d\""]},{"heading":"Heap object 1368: String@1368 (length 1)","items":[": \"c\""]},{"heading":"Heap object 1366: String@1366 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1436: Node@1436","items":["String item: reference to object 1385","Node next: reference to object 1435"]},{"heading":"Heap object 1435: Node@1435","items":["String item: reference to object 1368","Node next: reference to object 1434"]},{"heading":"Heap object 1434: Node@1434","items":["String item: reference to object 1366","Node next: reference to object 1433"]},{"heading":"Heap object 1433: Node@1433","items":["String item: reference to object 1364","Node next: null"]},{"heading":"Heap object 1431: LinkedStack@1431","items":["Node head: reference to object 1436","int size: 4"]}]}main:10Stackstack1431String@1385 (length 1)"d"String@1368 (length 1)"c"String@1366 (length 1)"b"String@1364 (length 1)"a"Node@1436Stringitem1385Nodenext1435Node@1435Stringitem1368Nodenext1434Node@1434Stringitem1366Nodenext1433Node@1433Stringitem1364NodenextnullLinkedStack@1431Nodehead1436intsize4

This is ONE possible implementation of the ADT. Note: The debugger breakpoint is on line 10. [download] [open]

Java program memory state. 1 stack frame; 7 heap objects.Stack frame: main:11 Stack stack: reference to object 1431 Heap object 1368: String@1368 (length 1) : "c" Heap object 1366: String@1366 (length 1) : "b" Heap object 1364: String@1364 (length 1) : "a" Heap object 1435: Node@1435 String item: reference to object 1368 Node next: reference to object 1434 Heap object 1434: Node@1434 String item: reference to object 1366 Node next: reference to object 1433 Heap object 1433: Node@1433 String item: reference to object 1364 Node next: null Heap object 1431: LinkedStack@1431 Node head: reference to object 1435 int size: 3{"summary":"Java program memory state. 1 stack frame; 7 heap objects.","sections":[{"heading":"Stack frame: main:11","items":["Stack stack: reference to object 1431"]},{"heading":"Heap object 1368: String@1368 (length 1)","items":[": \"c\""]},{"heading":"Heap object 1366: String@1366 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1435: Node@1435","items":["String item: reference to object 1368","Node next: reference to object 1434"]},{"heading":"Heap object 1434: Node@1434","items":["String item: reference to object 1366","Node next: reference to object 1433"]},{"heading":"Heap object 1433: Node@1433","items":["String item: reference to object 1364","Node next: null"]},{"heading":"Heap object 1431: LinkedStack@1431","items":["Node head: reference to object 1435","int size: 3"]}]}main:11Stackstack1431String@1368 (length 1)"c"String@1366 (length 1)"b"String@1364 (length 1)"a"Node@1435Stringitem1368Nodenext1434Node@1434Stringitem1366Nodenext1433Node@1433Stringitem1364NodenextnullLinkedStack@1431Nodehead1435intsize3

This is ONE possible implementation of the ADT. Note: The debugger breakpoint is on line 11. [download] [open]

Java program memory state. 1 stack frame; 5 heap objects.Stack frame: main:12 Stack stack: reference to object 1431 Heap object 1366: String@1366 (length 1) : "b" Heap object 1364: String@1364 (length 1) : "a" Heap object 1434: Node@1434 String item: reference to object 1366 Node next: reference to object 1433 Heap object 1433: Node@1433 String item: reference to object 1364 Node next: null Heap object 1431: LinkedStack@1431 Node head: reference to object 1434 int size: 2{"summary":"Java program memory state. 1 stack frame; 5 heap objects.","sections":[{"heading":"Stack frame: main:12","items":["Stack stack: reference to object 1431"]},{"heading":"Heap object 1366: String@1366 (length 1)","items":[": \"b\""]},{"heading":"Heap object 1364: String@1364 (length 1)","items":[": \"a\""]},{"heading":"Heap object 1434: Node@1434","items":["String item: reference to object 1366","Node next: reference to object 1433"]},{"heading":"Heap object 1433: Node@1433","items":["String item: reference to object 1364","Node next: null"]},{"heading":"Heap object 1431: LinkedStack@1431","items":["Node head: reference to object 1434","int size: 2"]}]}main:12Stackstack1431String@1366 (length 1)"b"String@1364 (length 1)"a"Node@1434Stringitem1366Nodenext1433Node@1433Stringitem1364NodenextnullLinkedStack@1431Nodehead1434intsize2

This is ONE possible implementation of the ADT. Note: The debugger breakpoint is on line 12. [download] [open]

Implementation

Implement the following methods with your group:

In LinkedStack:

  • peek

  • pop

Compile and Run

If we've done everything correctly, all of the tests should pass for LinkedStack!

Compile and run the code using the provided script:

./compile_and_run.sh

You should see "PASS" printed on the screen for all tests. If you see "FAIL", don't panic, carefully read the error message and update your code. Once it compiles and you get all "PASS" messages from the tester, stage and commit your work to Git and then merge into the main branch with the following commands:

Listing 83 Commands to stage, commit, and merge
git add src
git commit -m "Finished part 8"
Part 9: toString

If we want to write a toString method to print the size of the stack and the top item, where should it go?