/** * struct ListNode { * int val; * struct ListNode *next; * }; */ #include <cstddef> typedef struct ListNode LNode; 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 //创建新的头结点 LNode* newHead = (LNode*) malloc (sizeof(LNode)); newHead->next = head; //双指针 LNode* thisNode; LNode* priorNode = NULL; //定义m号节点 LNode* mNode; //定义n号节点 LNode* nNode; //定义m-1号节点 LNode* mPreNode = newHead; //定义n+1号节点 LNode* nNextNode; //接下来的任务就是把以上节点找到,即可 //找到m for (int i = 1; i < m; i++) { mPreNode = mPreNode->next; } thisNode = mPreNode->next; //找到了m号节点 mNode = thisNode; //双指针翻转 for (int i = m; i <= n; i++) { LNode* tempNode = thisNode->next; thisNode->next = priorNode; priorNode = thisNode; thisNode = tempNode; } //此时thisNode指向n+1号节点 priorNode指向n号节点 nNextNode = thisNode; nNode = priorNode; // 最后收尾操作 // m号节点反转过来指向的节点为n+1号节点 // n号节点因被m-1号e节点所指定 mNode->next = nNextNode; mPreNode->next = nNode; return newHead->next; } };
分析: 要么m>1或者m==1,为了统一m,设置一个新的头结点,使得m>1 n要么为最后一个节点,要么是大于n的e节点。 m号节点反转过来指向的节点为n+1号节点 n号节点因被m-1号e节点所指定,既是m-1号节点。