Elements are stored in contiguous memory (issue of allocation)
| Front of List | Middle of List | End of List | |
|---|---|---|---|
| get | O(1) | O(1) | O(1) |
| set | O(1) | O(1) | O(1) |
| insert | O(n) | O(n) | O(1) |
| remove | O(n) | O(n) | O(1) |
A linked list is a chain of nodes, where each node contains:
No need for contiguous memory allocation (nodes can be scattered anywhere in memory)
To create a linked list:
NodeWrite a class in Java called Node that has two instance variables: data (any type), and a reference to another node.
Write the constructor method, and a set and get method for each instance variable.
public class Node<T> {
private T data;
private Node<T> next;
// constructor
public Node(T data) {
this.data = data;
next = null;
}
// setters
public void setNext(Node<T> next) {
this.next = next;
}
public void setData(T data) {
this.data = data;
}
// getters
public Node<T> getNext() {
return next;
}
public T getData() {
return data;
}
}LinkedList classLinkedList classA linked list has a head (reference to a Node)
LinkedList set up and constructorHere’s our generic interface we used to implement our ArrayList:
public interface List<T> {
void append(T value);
void prepend(T value);
void insert(int index, T value);
int length();
T get(int index);
void set(int index, T value);
T pop(int index);
}Implement append, prepend and length in your LinkedList<T> class + a toString() method to test your code. Submit your List.java, Node.java and LinkedList.java files to gradescope.
Keep a tail instance variable.
toString() methodLet’s create a toString() method to test our list insertion.
Write a toString() method that traverses the entire list
toString() solutionsearch() methodWrite a search() method that traverses the entire list trying to find a node that matches the argument value – if found, return the true, otherwise return false. Add boolean search(T data) signature the the List.java interface.
search() is similar to toString() (write a while loop)Submit your List.java, Node.java and LinkedList.java with the search() method to gradescope.
search() solutionWhat we have implemented is an unsorted linked list – how many comparisons does it required to find a target element?
In the worst case, each node must be examined once, resulting in O(n) complexity – n is the number of elements in the list.
Removing a node takes a few more steps:
pop(int index)Implement pop(int index), get(int index), and set(int index, T value) in your LinkedList.java and submit it alongside with List.java and Node.java to gradescope.
LinkedList solutionpublic class LinkedList<T> implements List<T>{
private Node<T> head;
private Node<T> tail;
private int length;
public LinkedList() {
head = null;
tail = null;
length = 0;
}
public void append(T value) {
Node<T> nodeToAdd = new Node<>(value);
if (head == null) {
head = nodeToAdd;
tail = nodeToAdd;
} else {
tail.setNext(nodeToAdd);
tail = nodeToAdd;
}
};
public void prepend(T value) {
Node<T> nodeToAdd = new Node<>(value);
if (head == null) {
head = nodeToAdd;
tail = nodeToAdd;
} else {
nodeToAdd.setNext(head);
head = nodeToAdd;
}
length++;
}
public void insert(int index, T value) {
Node<T> nodeToAdd = new Node<>(value);
int count = 0;
Node<T> previous = null;
Node<T> cur = head;
while (cur != null) {
if (count == index) {
nodeToAdd.setNext(cur);
if (previous != null) previous.setNext(nodeToAdd);
else head = nodeToAdd;
return;
}
previous = cur;
cur = cur.getNext();
count++;
}
}
public int length() {return length; }
public T get(int index) {
int count = 0;
Node<T> cur = head;
while (cur != null) {
if (count == index) {
return cur.getData();
}
cur = cur.getNext();
count++;
}
return null;
}
public void set(int index, T value) {
int count = 0;
Node<T> cur = head;
while (cur != null) {
if (count == index) {
cur.setData(value);
return;
}
cur = cur.getNext();
count++;
}
}
public T pop(int index) {
int count = 0;
Node<T> previous = null;
Node<T> cur = head;
while (cur != null) {
if (count == index) {
if (previous != null) previous.setNext(cur.getNext());
return cur.getData();
}
previous = cur;
cur = cur.getNext();
count++;
}
return null;
}
public String toString() {
String out = "";
Node<T> cur = head;
while (cur != null) {
out += cur.getData() + " ";
cur = cur.getNext();
}
return out;
}
public boolean search(T data) {
Node<T> currNode = head;
while (currNode != null) {
if (currNode.getData().equals(data)) {
return true;
}
currNode = currNode.getNext();
}
return false;
}
}| Front of List | Middle of List | End of List | |
|---|---|---|---|
| get | O(1) | O(n) | O(1) |
| set | O(1) | O(n) | O(1) |
| insert | O(1) | O(n) | O(1) |
| remove | O(1) | O(n) | O(1) |
We just implemented a singly linked list
Doubly linked list:
Circular linked list: