Last active
July 21, 2020 16:21
-
-
Save sidsbrmnn/4181968152b53f355413e35c81d46cd5 to your computer and use it in GitHub Desktop.
Linked list operations in Java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class LinkedList { | |
private Node head; | |
public LinkedList() { | |
} | |
public LinkedList(Node head) { | |
this.head = head; | |
} | |
public LinkedList(LinkedList list) { | |
this.head = list.getHead(); | |
} | |
private Node getMiddleNode(Node head) { | |
Node result = head; | |
if (result != null) { | |
Node fast = head; | |
while (fast.next != null && fast.next.next != null) { | |
result = result.next; | |
fast = fast.next.next; | |
} | |
} | |
return result; | |
} | |
private Node merge(Node left, Node right) { | |
Node result; | |
if (left == null) { | |
result = right; | |
} else if (right == null) { | |
result = left; | |
} else { | |
if (left.value < right.value) { | |
result = left; | |
result.next = merge(left.next, right); | |
} else { | |
result = right; | |
result.next = merge(left, right.next); | |
} | |
} | |
return result; | |
} | |
private Node reverse(Node head) { | |
Node result; | |
if (head == null || head.next == null) { | |
result = head; | |
} else { | |
result = reverse(head.next); | |
head.next.next = head; | |
head.next = null; | |
} | |
return result; | |
} | |
private Node sort(Node head) { | |
Node result; | |
if (head == null || head.next == null) { | |
result = head; | |
} else { | |
Node middle = getMiddleNode(head); | |
Node nextToMiddle = middle.next; | |
middle.next = null; | |
Node left = sort(head); | |
Node right = sort(nextToMiddle); | |
result = merge(left, right); | |
} | |
return result; | |
} | |
public void append(int value) { | |
if (head == null) { | |
head = new Node(value); | |
} else { | |
Node current = head; | |
while (current.next != null) { | |
current = current.next; | |
} | |
current.next = new Node(value); | |
} | |
} | |
public void append(Node node) { | |
if (head == null) { | |
head = node; | |
} else { | |
Node current = head; | |
while (current.next != null) { | |
current = current.next; | |
} | |
current.next = node; | |
} | |
} | |
public void append(LinkedList list) { | |
if (head == null) { | |
head = list.getHead(); | |
} else { | |
Node current = head; | |
while (current.next != null) { | |
current = current.next; | |
} | |
current.next = list.getHead(); | |
} | |
} | |
public Node getHead() { | |
return head; | |
} | |
public boolean isEmpty() { | |
return head == null; | |
} | |
public void prepend(int value) { | |
if (head == null) { | |
head = new Node(value); | |
} else { | |
head = new Node(value, head); | |
} | |
} | |
public void prepend(Node node) { | |
if (head != null) { | |
Node current = node; | |
while (current.next != null) { | |
current = current.next; | |
} | |
current.next = head; | |
} | |
head = node; | |
} | |
public void prepend(LinkedList list) { | |
if (head != null) { | |
Node current = list.getHead(); | |
while (current.next != null) { | |
current = current.next; | |
} | |
current.next = head; | |
} | |
head = list.getHead(); | |
} | |
public void removeFirst() { | |
if (head != null) { | |
head = head.next; | |
} | |
} | |
public void reverse() { | |
head = reverse(head); | |
} | |
public void sort() { | |
head = sort(head); | |
} | |
@Override | |
public String toString() { | |
StringBuilder result = new StringBuilder(); | |
if (head != null) { | |
Node current = head; | |
while (current.next != null) { | |
result.append(current.value).append(" -> "); | |
current = current.next; | |
} | |
result.append(current.value); | |
} | |
return result.toString(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class Node { | |
int value; | |
Node next; | |
Node() { | |
} | |
Node(int value) { | |
this.value = value; | |
} | |
Node(int value, Node next) { | |
this.value = value; | |
this.next = next; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment