diff --git a/src/data-structures/linked-list/README.md b/src/data-structures/linked-list/README.md index 4c61851f..4a926d42 100644 --- a/src/data-structures/linked-list/README.md +++ b/src/data-structures/linked-list/README.md @@ -18,107 +18,123 @@ access, such as random access, is not feasible. Arrays have better cache locality as compared to linked lists. ![Linked List](https://upload.wikimedia.org/wikipedia/commons/6/6d/Singly-linked-list.svg) -## Pseudocode + +## Pseudocode for Basic Operations ### Insert - Add(value) - Pre: value is the value to add to the list - Post: value has been placed at the tail of the list - n ← node(value) - if head = ø - head ← n - tail ← n - else - tail.next ← n - tail ← n - end if - end Add + +```text +Add(value) + Pre: value is the value to add to the list + Post: value has been placed at the tail of the list + n ← node(value) + if head = ø + head ← n + tail ← n + else + tail.next ← n + tail ← n + end if +end Add +``` ### Search - Contains(head, value) - Pre: head is the head node in the list - value is the value to search for - Post: the item is either in the linked list, true; otherwise false - n ← head - while n = ø and n.value = value - n ← n.next - end while - if n = ø - return false - end if - return true - end Contains + +```text +Contains(head, value) + Pre: head is the head node in the list + value is the value to search for + Post: the item is either in the linked list, true; otherwise false + n ← head + while n = ø and n.value = value + n ← n.next + end while + if n = ø + return false + end if + return true +end Contains +``` ### Delete - Remove(head, value) - Pre: head is the head node in the list - Post: value is the value to remove from the list, true, otherwise false - if head = ø - return false - end if - n ← head - if n.value = value - if head = tail - head ← ø - tail ← ø - else - head ← head.next - end if - return true - end if - while n.next = ø and n.next.value = value - n ← n.next - end while - if n.next = ø - if n.next = tail - tail ← n - end if - n.next ← n.next.next - return true - end if - return false - end Remove + +```text +Remove(head, value) + Pre: head is the head node in the list + Post: value is the value to remove from the list, true, otherwise false + if head = ø + return false + end if + n ← head + if n.value = value + if head = tail + head ← ø + tail ← ø + else + head ← head.next + end if + return true + end if + while n.next = ø and n.next.value = value + n ← n.next + end while + if n.next = ø + if n.next = tail + tail ← n + end if + n.next ← n.next.next + return true + end if + return false +end Remove +``` ### Traverse - Traverse(head) - Pre: head is the head node in the list - Post: the items in the list have been traversed - n ← head - while n = 0 - yield n.value - n ← n.next - end while - end Traverse + +```text +Traverse(head) + Pre: head is the head node in the list + Post: the items in the list have been traversed + n ← head + while n = 0 + yield n.value + n ← n.next + end while +end Traverse +``` ### Traverse in Reverse - ReverseTraversal(head, tail) - Pre: head and tail belong to the same list - Post: the items in the list have been traversed in reverse order - if tail = ø - curr ← tail - while curr = head - prev ← head - while prev.next = curr - prev ← prev.next - end while - yield curr.value - curr ← prev - end while - yeild curr.value - end if - end ReverseTraversal +```text +ReverseTraversal(head, tail) + Pre: head and tail belong to the same list + Post: the items in the list have been traversed in reverse order + if tail = ø + curr ← tail + while curr = head + prev ← head + while prev.next = curr + prev ← prev.next + end while + yield curr.value + curr ← prev + end while + yeild curr.value + end if +end ReverseTraversal +``` -## Big *O* +## Complexities ### Time Complexity -Access: *O*(*n*) \ -Search: *O*(*n*) \ -Insert: *O*(1) \ -Delete: *O*(1) + +| Access | Search | Insertion | Deletion | +| :-------: | :-------: | :-------: | :-------: | +| O(n) | O(n) | O(1) | O(1) | ### Space Complexity -*O*(*n*) + +O(n) ## References