/** * struct ListNode { * int val; * struct ListNode *next; * }; */ class Solution { public: /** * * @param head ListNode类 * @param m int整型 * @param n int整型 * @return ListNode类 */ ListNode* reverseBetween(ListNode* head, int m, int n) { // write code here if(m==n) { return head; } ListNode* pseudo = nullptr; pseudo = new ListNode(0);// 注意初始化的方式 pseudo->next = head; ListNode* left = pseudo; //之前就错在 head的位置 head->val 就是第一个元素! int cnt = 0; while(left!=nullptr) { if(cnt==m-1) break; left = left->next; cnt++; } // cout<<left->val; ListNode* right = left; while(right!=nullptr) { right = right->next; cnt++; if(cnt==n+1) break; } // cout<<right->val; // 此时两个指针指向指定区间的 类似head 和尾巴处之后的位置 cnt = m; ListNode* pre = right; ListNode* curr = left->next; while(cnt<=n) { ListNode* tmp = curr->next; curr->next = pre; pre = curr; curr = tmp; cnt++; } left->next = pre; return pseudo->next; } };
我自己的做法,才意识到 链表默认没有前一个伪结点