[Leetcode] 92. Reverse-linked-list-ii(アナログ)[中]

リンク

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

おすすめ

転載: blog.csdn.net/Krone_/article/details/114969452