2022-06-15 22:12:54 +08:00
|
|
|
# Leetcode Reverse-Linked-List
|
|
|
|
|
|
|
|
#### 2022-06-15 22:07
|
|
|
|
|
|
|
|
---
|
|
|
|
##### Algorithms:
|
2022-06-15 22:32:23 +08:00
|
|
|
#algorithm #recursion #iteration
|
2022-06-15 22:12:54 +08:00
|
|
|
##### Data structures:
|
|
|
|
#DS #linked_list
|
|
|
|
##### Difficulty:
|
2022-06-15 23:14:20 +08:00
|
|
|
#leetcode #coding_problem #difficulty-medium
|
2022-06-15 22:53:24 +08:00
|
|
|
##### Lists:
|
|
|
|
#CS_list_need_understanding #CS_list_need_practicing
|
2022-06-15 22:12:54 +08:00
|
|
|
##### Related topics:
|
|
|
|
```expander
|
|
|
|
tag:#linked_list
|
|
|
|
```
|
2022-06-15 22:53:24 +08:00
|
|
|
|
2022-06-15 22:12:54 +08:00
|
|
|
|
|
|
|
|
|
|
|
##### Links:
|
2022-06-15 22:32:23 +08:00
|
|
|
- [Link to problem](https://leetcode.com/problems/reverse-linked-list/)
|
2022-06-15 22:12:54 +08:00
|
|
|
___
|
|
|
|
### Problem
|
2022-06-15 22:32:23 +08:00
|
|
|
Given the `head` of a singly linked list, reverse the list, and return _the reversed list_.
|
2022-06-15 22:12:54 +08:00
|
|
|
#### Examples
|
2022-06-15 22:32:23 +08:00
|
|
|
**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:**
|
|
|
|
|
2022-06-15 22:12:54 +08:00
|
|
|
```markdown
|
2022-06-15 22:32:23 +08:00
|
|
|
**Input:** head = []
|
|
|
|
**Output:** []
|
2022-06-15 22:12:54 +08:00
|
|
|
```
|
|
|
|
|
|
|
|
#### Constraints
|
2022-06-15 22:32:23 +08:00
|
|
|
- The number of nodes in the list is the range `[0, 5000]`.
|
|
|
|
- `-5000 <= Node.val <= 5000`
|
2022-06-15 22:12:54 +08:00
|
|
|
|
|
|
|
### Thoughts
|
|
|
|
|
2022-06-15 22:53:24 +08:00
|
|
|
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.
|
2022-06-15 22:12:54 +08:00
|
|
|
|
|
|
|
### Solution
|
2022-06-15 22:53:24 +08:00
|
|
|
I've referred to this guy: https://leetcode.com/problems/reverse-linked-list/discuss/58130/C%2B%2B-Iterative-and-Recursive
|
|
|
|
|
2022-06-15 23:14:20 +08:00
|
|
|
This code is hard to understand.
|
|
|
|
==TODO==: Make my own version
|
2022-06-15 22:53:24 +08:00
|
|
|
```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) {
|
2022-06-15 23:14:20 +08:00
|
|
|
// temp points to head
|
2022-06-15 22:53:24 +08:00
|
|
|
ListNode *temp = pre->next;
|
2022-06-15 23:14:20 +08:00
|
|
|
// Move cur->next after pre.
|
2022-06-15 22:53:24 +08:00
|
|
|
pre->next = cur->next;
|
2022-06-15 23:14:20 +08:00
|
|
|
// Fix pointers, because cur->next is unchanged when changing position.
|
2022-06-15 22:53:24 +08:00
|
|
|
cur->next = cur->next->next;
|
|
|
|
pre->next->next = temp;
|
|
|
|
}
|
|
|
|
return pre->next;
|
|
|
|
}
|
|
|
|
};
|
2022-06-15 23:14:20 +08:00
|
|
|
```
|
|
|
|
|
|
|
|
Recursion:
|
|
|
|
```cpp
|
|
|
|
class Solution {
|
|
|
|
public:
|
|
|
|
ListNode *reverseList(ListNode *head) {
|
|
|
|
// Base case: reached the end of list
|
|
|
|
if (!head || !(head->next)) {
|
|
|
|
return head;
|
|
|
|
}
|
|
|
|
|
|
|
|
// node is the end of linked list, which stays the same and untouched
|
|
|
|
ListNode *node = reverseList(head->next);
|
|
|
|
// change head->next
|
|
|
|
head->next->next = head;
|
|
|
|
head->next = NULL;
|
|
|
|
return node;
|
|
|
|
}
|
|
|
|
};
|
2022-06-15 22:53:24 +08:00
|
|
|
```
|