C++学习笔记#21(2021.6.6)

192 阅读1分钟

反转链表 ②(力扣No.92)

image.png 代码:

    ListNode* reverseBetween(ListNode* head, int left, int right) {
        int change_len = right - left + 1;//逆置段长度
        ListNode* pre_head = nullptr;//初始化逆置段的前驱
        ListNode* result = head;//非特殊情况为head(特殊情况为left = 1)
        while (head && --left) {//如果left=1,则不会进入while,即34行pre_head会为nullptr
            pre_head = head;//保存逆置段的前驱
            head = head->next;
        }
        ListNode* modify_list_tail = head;//保存逆置段首节点(即逆置后的尾结点modify_list_tail))
        ListNode* new_head = nullptr;
        //就是反转链表一的方法,只不过用change_len控制反转的长度
        while (head && change_len) {
            ListNode* next = head->next;
            head->next = new_head;
            new_head = head;
            head = next;
            change_len--;
        }
        modify_list_tail->next = head;//此时head指向的是逆置段的后驱
        if (pre_head) { pre_head->next = new_head; }
        else { result = new_head; }
        return result;
    }