リンク
https://leetcode-cn.com/problems/reverse-linked-list-ii/
時間がかかる
問題解決:1時間12分
問題解決:8分
題名
リンクリストを位置mからnに反転します。1回のスキャンで反転を完了してください。
説明:
- 1≤m≤n≤リンクリストの長さ。
アイデア
フリップの開始ノードの前にノードleft_beforeを設定し、フリップの終了ノードの後にノードright_nextを設定し、right_nextが検出されるまで、現在の左ノードの次のノードをleft_beforeの後に継続的に配置します。
時間計算量:O(n)O(n)O (n )
ACコード
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int left, int right) {
ListNode* dummy_head = new ListNode(-1, head);
ListNode* left_node = dummy_head;
ListNode* left_bef_node = dummy_head;
for(int i = 0; i < left-1; ++i) left_bef_node = left_bef_node->next;
left_node = left_bef_node->next;
ListNode* right_node = dummy_head;
for(int i = 0; i < right; ++i) right_node = right_node->next;
ListNode* right_nex_node = right_node->next;
ListNode* now = left_node->next;
while(now != right_nex_node) {
left_node->next = now->next;
now->next = left_bef_node->next;
left_bef_node->next = now;
now = left_node->next;
}
return dummy_head->next;
}
};