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;
        }
    }
}
posted @ 2024-01-19 16:15  BAIHF  阅读(4)  评论(0)    收藏  举报
/* 鼠标点击求赞文字特效 */