49-Reverse Linked List II
阅读原文时间:2023年07月08日阅读:1
  1. Reverse Linked List II My Submissions QuestionEditorial Solution

    Total Accepted: 70579 Total Submissions: 252986 Difficulty: Medium

    Reverse a linked list from position m to n. Do it in-place and in one-pass.

For example:

Given 1->2->3->4->5->NULL, m = 2 and n = 4,

return 1->4->3->2->5->NULL.

思路:

时间复杂度:O(n),空间复杂度O(1)

找到指定段元素,对该段元素逆转,同时保留指定段的两端的邻居

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
            assert(n>=m);
            if(m==n)return head;
            int i=1,j=1;
            ListNode *p=head,*q=head,*prep=NULL;//保留指定段首元素的前一元素
            while(p!=NULL&&i++<m){
                if(i==m)prep=p;
                p=p->next;
            }
            while(q!=NULL&&j++<n)q=q->next;/找到各自的最终位置,越界为空
            if(p==NULL)return head;       //起始位置越界,直接返回head
            ListNode * tmp = p->next,*prenode = p,*qnext=q->next;
            while(tmp!=qnext)         //还未到达指定段的下一元素,则当前元素指向前一元素
            {
                ListNode *nextnode = tmp->next;
                tmp->next = prenode;
                prenode = tmp;
                tmp = nextnode;
             }
             p->next = qnext;
             if(prep!=NULL)prep->next = prenode;
             else head = prenode;
             return head;
        }
};