notes/CS notes/pages/Leetcode Reverse-Linked-List.md

106 lines
2.4 KiB
Markdown
Raw Normal View History

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
```