题解 | #链表内指定区间反转#

链表内指定区间反转

https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c

/**
 * 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 ) {
    // write code here
    if(head == NULL || m == n || head->next == NULL){
        return head;
    }
    struct ListNode* p = (struct ListNode*)malloc(sizeof(struct ListNode));
    p->next = head; //想定义一个空的节点,然后让它指向头节点,再将头节点指针指向它
    head = p;
    for(int i = 0; i < m - 1; i++){
        p = p->next; //找到需要转换的第一个节点的前一个结点
    }
    printf("%d",p->val);
    int size = n - m;
    struct ListNode* h = p->next, *q = NULL;
    struct ListNode* next = h->next;
 	//h为第一个需要转换的节点
    for(int i = 0; i <= size; i++){
        h->next = q;
        q = h;
        h = next;
        next = h->next;
    }
    p->next->next = h;  //将转换完成后的最后一个节点指向原本转换区间的下一个节点
    p->next = q; //转换完成后,将转换区间的前一个结点指向转换完成后第一个节点
    return head->next;
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务