Reverse a singly linked list.
This one is supposed to be easy. However, a lot of companies tend to ask for several versions to solve it. Facebook tends to ask for iteration and recursive.
// Method1:
ListNode* reverseList(ListNode* head) {
if(!head || !head->next) return head;
ListNode* dummy = NULL;
while(head) {
ListNode* tmp = head->next;
head->next = dummy;
dummy = head;
head = tmp;
}
return dummy;
}
// Method2: Recursion.
ListNode* reverseList(ListNode* head) {
if(!head || !head->next) return head;
ListNode* second = head->next;
head->next = NULL;
ListNode* rest = reverseList(second);
second->next = head;
return rest;
}
Further follow up: Reverse linked list without changing pointers.
ListNode* helper(ListNode* head, ListNode*& left, bool& meet) {
if(!head || !head->next) return head;
ListNode* right = helper(head->next, left, meet);
if(!meet) {
int tmp = left->val;
left->val = right->val;
right->val = tmp;
left = left->next;
if(left == right || left->next == right) meet = true;
}
return head;
}
ListNode* reverse(ListNode* head) {
ListNode* left = head;
bool meet = false;
helper(head, left, meet);
return head;
}