BM2 链表内指定区间反转
总结:
问题1:不要忘记while循环内的自变量自增
问题2:这道题只考虑了n的边界条件,没有考虑m的边界条件(m=1),以后要考虑全面
// 反转链表
struct ListNode* reverseList(struct ListNode* head) {
if(head == NULL) return head;
struct ListNode *tmpNode = (struct ListNode*)malloc(sizeof(struct ListNode));
struct ListNode *curNode = head;
head = head->next;
tmpNode->next = NULL;
while(head != NULL)
{
curNode->next = tmpNode->next;
tmpNode->next = curNode;
curNode = head;
head = head->next;
}
curNode->next = tmpNode->next;
tmpNode->next = curNode;
return tmpNode->next;
}
// 反转[m,n]的数据
struct ListNode* reverseBetween(struct ListNode* head, int m, int n )
{
struct ListNode *startNode,*endNode,*end_pre_node;
startNode = head;
int i = 1;
while(startNode->next!=NULL && i<m-1)// 此时startNode指向第m个元素的前一个元素
{
startNode = startNode->next;
++i;
}
endNode = startNode->next;
end_pre_node = startNode;
int j = i+1;
while(endNode != NULL && j<n+1)
{
end_pre_node = endNode;
endNode = endNode->next;
++j;
}// 此时endNode指向第n个元素的后一个元素,end_pre_node指向第n个元素
if(m != 1)
{
if(endNode == NULL)
{
startNode->next = reverseList(startNode->next);
return head;
}
else
{
end_pre_node->next = NULL;
startNode->next = reverseList(startNode->next);
end_pre_node = head;
while (end_pre_node->next != NULL)
end_pre_node = end_pre_node->next;
end_pre_node->next = endNode;
return head;
}
}
else // 特殊处理:当m=1时,在用startNode指向第m个元素的前一个元素,就会出错
{
if(endNode == NULL)
{
head = reverseList(head);
return head;
}
else
{
end_pre_node->next = NULL;
head = reverseList(head);
end_pre_node = head;
while (end_pre_node->next != NULL)
end_pre_node = end_pre_node->next;
end_pre_node->next = endNode;
return head;
}
}
}

浙公网安备 33010602011771号