考察的知识点:与链表有关的题基本都是插入,删除,交换顺序等,解决这些问题通常将链表的指针进行修改。

问题分析:这道题可以用头插来做,也可以用栈来做,相比上一道要容易些,大致思路和上一个差不多;prev指向第一个翻转结点的前一个,end指向第一个翻转的结点,cur指向翻转的结点,next指向翻转结点的下一个结点,然后对第left到第right个的结点头插,最后在将头插的和未投插的结点连接起来。

本题解析所用的编程语言:c++

ListNode* reverseBetween(ListNode* head, int left, int right)
{
    // write code here
    ListNode* newhead = new ListNode(-501);
    newhead->next = head;

    ListNode* prev = newhead; //prev是开始进行翻转的前一个结点
    int n = 1;
    while (n < left)
    {
        prev = prev->next;
        ++n;
    }
    ListNode* cur = prev->next; //cur是需要翻转的结点
    ListNode* next = cur->next; //next是翻转的结点的下一个结点
    ListNode* end = cur; //end是第left个结点
    while (left <= right)
    {
        //头插
        cur->next = prev->next;
        prev->next = cur;
        //更新结点
        cur = next;
        if (next)
            next = next->next;
        ++left;
    }
    //连接
    end->next = cur;

    head = newhead->next;
    delete newhead;

    return head;
}