/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) {
//思路
//创建一个头结点,找到并指向结点m,把原链表从m结点处断开,m结点就作为了反序链表的第一个结点,将该结点后面的n-m个结点,全部依次前移;
struct ListNode HeadNode = { NULL };
struct ListNode *pReverseHead = NULL;
struct ListNode *pMove = NULL;
struct ListNode *pTemp = NULL;
struct ListNode *pHeadPrevious = head;
int i = 1;
if (head == NULL) {
return NULL;
}
//找到结点m
pReverseHead = head;
while (i < m) {
pHeadPrevious = pReverseHead;
pReverseHead = pReverseHead->next;
i++;
}
HeadNode.next = pReverseHead; // 记录要反序的第一个结点
pMove = pReverseHead->next; // 从第一个结点的下一个结点开始移动
i = 0; //记录处理的结点个数,实现终止条件
while ((i < (n - m)) && (pMove != NULL)) {
pTemp = pMove; // 记录要被移动的成员
pReverseHead->next = pTemp->next; //断链
// 插入到头结点的后面,成为新的第一结点
pTemp->next = HeadNode.next;
HeadNode.next = pTemp;
pMove = pReverseHead->next; // 继续处理下一个结点
i++;
}
// 如果m为1,本身就是第一个结点,直接返回反序链表即可
if (m == 1) {
return HeadNode.next;
}
// 此方法相当于把原链表从m结点处断开了,如果实际移动了,需要将原链表与反序链表进行连接
if (i > 0) {
pHeadPrevious->next = HeadNode.next;
}
return head;
}