text: // 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?
  
  // solution: linked-list
  
  /**
   * Definition for singly-linked list.
   * struct ListNode {
   *     int val;
   *     ListNode *next;
   *     ListNode(int x) : val(x), next(NULL) {}
   * };
   */
  class Solution {
  public:
      ListNode* reverseList(ListNode* head) {
          if (head == nullptr || head->next == nullptr) {
              return head;
          }
  
          ListNode *back = head, *front = head->next, *temp = nullptr;
  
          while (front) {
              temp = front->next;
              front->next = back;
              back = front;
              front = temp;
          }
  
          head->next = nullptr;
          return back;
      }
  };