---
# System prepended metadata

title: Reverse Linked List II
tags: [Linked List, LeetCode]

---

---
description: Today 1 leet , tomorrow 頂天leet地
image: https://leetcode.com/static/images/LeetCode_Sharing.png
---
# Reverse Linked List II
[題目網址<i class="fa fa-link"></i>](https://leetcode.com/problems/reverse-linked-list-ii/)
## 題目敘述
Given the `head` of a singly linked list and two integers `left` and `right` where `left <= right`, reverse the nodes of the list from position `left` to position `right`, and return the reversed list.

:::spoiler **Example 1**

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

:::spoiler **Example 2**
> **Input:** head = [5], left = 1, right = 1
> **Output:** [5]
:::


## 解題思維
將陣列分為三等分l,m,r，並新增一個指向head的指標，以stack存取m的元素將其反轉，
重新連接l-m-r。
以範例1為例:
1.分為三等份l,m,r
[`1`,  `2,3,4`, `5`]
2.反轉m
[`1`,  `4,3,2`, `5`]

## 程式碼

```cpp=
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        ListNode *h=new ListNode(),*l,*m,*r;
        stack<ListNode*> s;
        int index=0;
        h->next=head;
        l=h;
        while(index<left-1)
        {
            l=l->next;
            index++;
        }
        m=l;
        while(index<right)
        {
            s.push(m->next);
            index++;
            m=m->next;
        }
        r=m->next;
        if(!s.empty())
        {
            l->next=s.top();
            l=l->next;
            s.pop();
            while(!s.empty())
            {
                l->next=s.top();
                l=l->next;
                s.pop();
            }
            l->next=r;
        }
       return h->next;
    }
};
```


$O(n)$




###### tags: `LeetCode` `Linked List`