92. 反转链表 II

92. 反转链表 II


题目链接:92. 反转链表 II

代码如下:

/**
 * 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) {
        //无节点或只有一个节点
        if(head==nullptr||head->next==nullptr)
            return head;

        //如果左边大于等于右边,直接返回即可
        if(left>=right)
            return head;

        ListNode* Head=new ListNode;
        Head->next=head;
        ListNode *p=Head;
        ListNode *q=nullptr;

        //找到要逆置的起点
       for(int i=0;i<left-1;i++)
            p=p->next;

        q=p->next;
        ListNode* r=q;//保存第一个逆置的节点,他最后会变成逆置的最后节点
        p->next=nullptr;

        //头插法进行逆置
       for(int i=0;i<right-left+1;i++)
       {
            ListNode* temp=q;
            q=q->next;

            temp->next=p->next;
            p->next=temp;   
       }

        //将逆置的最后一个节点与后面的节点相连
        r->next=q;
        return Head->next;
    }
};

你可能感兴趣的:(leetcode,链表,c++)