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

链表内指定区间反转

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

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        // write code here
        if(head==nullptr) // 防止为空链表
            return head;
        if(m==n)  // 如果m==n 则说明为无效反转
            return head;
	    // 两个指针 p指针指向第m个元素,pre指针指向p的前驱
	    // 注意:若从第一个元素开始反转,则pre==nullptr
        ListNode* p = head;  
        ListNode* pre=nullptr;
        for(int i=1;i<m;i++)
        {
            pre=p;
            p=p->next;
        }
	    // end 指针表示反转结束后的第n个结点,需要将其重新链入链表中。
        ListNode* end =nullptr;
	  	// 让p指针往后移动一下,从m+1的位置开始反转
        p=p->next;
	  	// count表示当前反转完几个结点
        int count=1;
        if(pre == nullptr) // 表示从第一个结点开始反转,需要特殊处理,即更新head
        {
            end = head; // head即为反转结束的第n个结点
            while(count + m <= n)
            {
                ListNode* t = p->next;
                p->next = head;
                head=p;
                p=t;
                count++;
            }
        }
        else 
        {
            end = pre->next;
            while(count + m <= n)
            {
                ListNode* t = p->next;
                p->next = pre->next;
                pre->next = p;
                p = t;
                count++;
            }
        }
	  	// 将反转后的重新链入链表中
        end ->next = p;
        return head;
    }
};

#牛客创作赏金赛#
牛客网刷题记录 文章被收录于专栏

本人认为值得记录的一些题

全部评论

相关推荐

不愿透露姓名的神秘牛友
03-18 14:29
牛客604067584号:感觉算法卷的人少很多,毕竟只有一部分bg还不错的硕士才会考虑算法,虽然hc不如后端,但是竞争真的少很多。
点赞 评论 收藏
分享
03-25 19:00
东北大学 Java
程序员牛肉:太好了,是聊天记录。不得不信了。 当个乐子看就好,不要散播焦虑
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务