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

链表内指定区间反转

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

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        if(m == n) return head; // 如果 m == n,说明没有发生反转,直接返回头节点
        ListNode* result = head;    // 用来找第n+1个节点
        ListNode* find_before_head = head;  // 用来找第m-1个节点
        ListNode* before_m = new ListNode(-1); // 用来记录第m-1个节点
        ListNode* after_n = NULL;   // 用来记录第n+1个节点
        // 找第m - 1个节点
        if(m == 1){
            before_m->next = head;
        }else{
            while(find_before_head){    // m > 1时,就这么找第m-1个节点
                m--;
                if(m == 1) before_m = find_before_head;
                find_before_head = find_before_head->next;
            }
        }
        // 找第n+1个节点
        while(result){
            n--;
            if(n == -1){
                after_n = result;
            }
            result = result->next;
        }
        ListNode* pre = after_n;    // 参考反转链表,pre此时应是第n+1个节点
        ListNode* cur = before_m->next; // cur此时应是第m个节点
        while(cur != after_n){
            ListNode* temp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = temp;
        }
        before_m->next = pre;
        if(before_m->val == -1) return before_m->next;
        return head;
    }
};

机械转码刷题进行中~ 文章被收录于专栏

这是一个机械专业学生艰难的转码之路,只会用最简单的想法跟思路,请各路大神不吝赐教,在评论区分享你们的想法!!!

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务