将链表分成三部分,区间左边的和区间右边的,再加上区间链表。写一个反转链表的函数,将区间的链表进行反转,然后拼接三个链表。这写的有点繁琐了
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
class Solution {
public:
/**
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
//反转链表
ListNode* reverseList(ListNode* head)
{
if(!head) return NULL;
ListNode* tmp = (ListNode*) malloc(sizeof(struct ListNode));
ListNode* next = NULL;
tmp->next = NULL;
while(head)
{
next = head->next;
head->next = tmp->next;
tmp->next = head;
head = next;
}
return tmp->next;
}
ListNode* reverseBetween(ListNode* head, int m, int n)
{
if(m == n) return head;
// write code here
ListNode* begin = NULL, *end = NULL, *reverseHead = NULL, *reverseEnd = NULL;
ListNode* tmp = head;
int i = 1;
while(tmp)
{
if(i == m)
reverseHead = tmp;
if(i == n)
{
reverseEnd = tmp;
end = tmp->next;
break;
}
tmp = tmp->next;
i++;
}
i = 1;
reverseEnd->next = NULL; //断开链表
reverseHead = reverseList(reverseHead); // 局部链表反转
tmp = reverseHead;
while(tmp->next)
tmp = tmp->next;
tmp->next = end; //链接尾部链表
if(m == 1) return reverseHead;
tmp = head;
while (tmp)
{
if(i == m-1)
{
begin = tmp;
break;
}
tmp = tmp->next;
i++;
}
begin->next = reverseHead;
return head;
}
};