Reverse Linked List
// https://leetcode.com/problems/reverse-linked-list
/*
Given the head of a singly linked list, reverse the list, and return the reversed list.
Ex1:
Input: head = [1,2,3,4,5]
Output: [5,4,3,2,1]
Ex2:
Input: head = [1,2]
Output: [2,1]
Ex3:
Input: head = []
Output: []
*/
#include <cassert>
#include <vector>
using namespace std;
class ListNode {
public:
int val;
ListNode* next;
ListNode(int val) {
this->val = val;
this->next = nullptr;
}
};
// Time: O(n), Space: O(1)
ListNode* reverseList(ListNode* head) {
if (!head || !head->next) {
return head;
}
ListNode* prev = nullptr;
ListNode* cur = head;
ListNode* next = nullptr;
while (cur) {
next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
return prev;
}
// Helper function to create a linked list from a vector
ListNode* createLinkedList(const vector<int>& nums) {
if (nums.empty()) return nullptr;
ListNode* head = new ListNode(nums[0]);
ListNode* current = head;
for (int i = 1; i < nums.size(); i++) {
current->next = new ListNode(nums[i]);
current = current->next;
}
return head;
}
// Helper function to compare two linked lists
bool compareLinkedLists(ListNode* l1, ListNode* l2) {
while (l1 && l2) {
if (l1->val != l2->val) return false;
l1 = l1->next;
l2 = l2->next;
}
return l1 == nullptr && l2 == nullptr; // ensure both lists are exhausted
}
int main() {
// Test case 1
ListNode* l1 = createLinkedList({ 1, 2, 3, 4, 5 });
ListNode* reversed1 = reverseList(l1);
assert(compareLinkedLists(reversed1, createLinkedList({ 5, 4, 3, 2, 1 })));
// Test case 2
ListNode* l2 = createLinkedList({ 1, 2 });
ListNode* reversed2 = reverseList(l2);
assert(compareLinkedLists(reversed2, createLinkedList({ 2, 1 })));
// Test case 3
ListNode* l3 = createLinkedList({});
ListNode* reversed3 = reverseList(l3);
assert(compareLinkedLists(reversed3, createLinkedList({})));
return 0;
}```
Last updated