/**
* 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号节点。