# Leetcode Reverse-Linked-List #### 2022-06-15 22:07 --- ##### Algorithms: #algorithm #recursion #iteration ##### Data structures: #DS #linked_list ##### Difficulty: #leetcode #coding_problem #difficulty-easy ##### Lists: #CS_list_need_understanding #CS_list_need_practicing ##### Related topics: ```expander tag:#linked_list ``` ##### Links: - [Link to problem](https://leetcode.com/problems/reverse-linked-list/) ___ ### Problem Given the `head` of a singly linked list, reverse the list, and return _the reversed list_. #### Examples **Example 1:** ![](https://assets.leetcode.com/uploads/2021/02/19/rev1ex1.jpg) ```markdown **Input:** head = [1,2,3,4,5] **Output:** [5,4,3,2,1] ``` **Example 2:** ![](https://assets.leetcode.com/uploads/2021/02/19/rev1ex2.jpg) ```markdown **Input:** head = [1,2] **Output:** [2,1] ``` **Example 3:** ```markdown **Input:** head = [] **Output:** [] ``` #### Constraints - The number of nodes in the list is the range `[0, 5000]`. - `-5000 <= Node.val <= 5000` ### Thoughts I thought a slow O(n ^ 2) hybrid solution, while there are better algorithms, using in-place insert, or recursion. The in place insert is easier to understand, and simple to implement, using a very clever trick. ### Solution I've referred to this guy: https://leetcode.com/problems/reverse-linked-list/discuss/58130/C%2B%2B-Iterative-and-Recursive ```cpp class Solution { public: ListNode *reverseList(ListNode *head) { ListNode *pre = new ListNode(0), *cur = head; // pre is before head, and insert any element after pre. pre->next = head; while (cur && cur->next) { // Move cur->next after pre. ListNode *temp = pre->next; pre->next = cur->next; cur->next = cur->next->next; pre->next->next = temp; } return pre->next; } }; ```