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

链表内指定区间反转

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) {
        //抽书法交换位置
	    //int抽书的次数
        int s=n-m;
        if(head==nullptr||n==m){//当m=n时返回头节点
            return head;
        } 
		//定义一个虚拟节点让它一直指向头节点
        ListNode* dummy=new ListNode(0);
	  //2. new ListNode(0):new是C++中的动态内存分配操作符,表示在堆(heap)上分配内存,并创建一个新的ListNode对象。ListNode(0)表示调用ListNode结构体的构造函数,用值0初始化节点的val,即该节点的值为0,并且默认构造函数会将next指针初始化为nullptr。
        dummy->next=head;
        //创建per节点在头节点前面
        ListNode* per=dummy;
	  //找到开始反转的前一位置和反转位置和反转的下一位置
        for(int i=1;i<m;i++){
            per=per->next;
        }
	  //创建当前节点
        ListNode* cur=per->next;
	  //创建当前的下一个节点
        ListNode* nex;
       for(int i=0;i<n-m;i++){
		 //nex要每次都是cur的下一个
            nex=cur->next;
		 //当前节点指向后一个节点的后一个节点
            cur->next=nex->next;
		 //后一节点指向per的后一节点
            nex->next=per->next;
		 //per指向nex节点
            per->next=nex;
        }
        return dummy->next;
    }
};

全部评论

相关推荐

10-17 13:54
上海大学 运营
雾凇岛:这还说什么了,冲了兄弟们
点赞 评论 收藏
分享
面了100年面试不知...:太礼貌,还是
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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