notes/CS notes/pages/Leetcode Reverse-Linked-List.md
2022-06-15 22:53:24 +08:00

83 lines
1.8 KiB
Markdown

# 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;
}
};
```