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

1.8 KiB

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

tag:#linked_list

Problem

Given the head of a singly linked list, reverse the list, and return the reversed list.

Examples

Example 1:

**Input:** head = [1,2,3,4,5]
**Output:** [5,4,3,2,1]

Example 2:

**Input:** head = [1,2]
**Output:** [2,1]

Example 3:

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

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