LeetCode 206. Reverse Linked List
The Problem
Link to original problem on Leetcode
Reverse a singly linked list.
Example
Input: 1->2->3->4->5->NULL
Output: 5->4->3->2->1->NULL
Follow up: A linked list can be reversed either iteratively or recursively. Could you implement both?
My Solution
Here are my attempts to reverse the list both iteratively and recursively.
Iterative Version
Here I create variables to store the list I’m iterating through, and the new one I’m building up. I go through the original list with a while loop, setting the reversedList to equal a new node with the currentNode’s value as its own and the previous value of reversedList as the next node. Then the currentNode is set to it’s next value. The loop terminates when the next node of currentList is null.
Got a 98.12% on speed (68ms), but only 38.39% (38.7mb) on memory.
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
const reverseList = head => {
let currentNode = head;
let reversedList = null;
while (currentNode) {
reversedList = new ListNode(currentNode.val, reversedList);
currentNode = currentNode.next;
}
return reversedList;
};
Recursive Version
If head is null, then return the value of reversed immediately. Otherwise, return the function with head’s next node as the new head and a new ListNode for reversed with head’s value as the value and the previous value of reversed as the next node.
Got a 86.52% on speed (76ms), but only 5% (39.5mb) on memory.
const reverseList = (head, reversed = null) => {
if (!head) return reversed;
return reverseList(head.next, new ListNode(head.val, reversed));
};
Best Solution
I need to review more of these solutions. Rather than create new ListNodes, they tend to just store one value or another in a temporary variable and then mutate the originals to flip things around.
Example:
const reverseList = (head, prev = null) => {
if (!head) return prev;
let temp = head.next;
head.next = prev;
return reverseList(temp, head);
};
const reverseList = head => {
let node = head,
reversed = null;
while (node) {
let temp = node;
node = node.next;
temp.next = reversed;
reversed = temp;
}
return reversed;
};