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

链表内指定区间反转

http://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(head == NULL || head->next==NULL){
            return head;
        }
        //辅助指针
        ListNode * cur = head;
        //辅助指针移动到m的前一个节点
        for(int i=0;i<m-2;i++){
            cur = cur->next;
        }
        ListNode * pre = NULL;
        ListNode * tmp_head = head;
        //当m大于1则辅助节点移动到m,临时头节点指向m的上一节点
        if(m>1){
            tmp_head = cur;
            cur = cur->next;
        }
        //辅助翻转的临时指针
        ListNode * tmp;
        //当前指针为翻转后的尾巴
        ListNode * tmp_tail = cur;
        //翻转m-n节点
        for(int j=m-1;j<n;j++){
            tmp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = tmp;
        }
        //翻转过后cur为尾巴的下一个节点
        tmp_tail->next = cur;
        //如果m>1则cur的上一个节点即pre需要链接到tmp_head
        if(m>1){
            tmp_head->next = pre;
        }
        //此种情况为头到尾都要翻转
        else if(cur == NULL){
            return pre;
        }
        //头到n翻转
        else{
             head = pre; 
        }
        return head;
        
    }
};
全部评论

相关推荐

等华子还是签贝壳?
浩浩找实习:贝壳神中神梦中情场,但是没有面试机会
点赞 评论 收藏
分享
头像
10-15 22:27
已编辑
门头沟学院 C++
罗格镇的小镇做题家:我投了hr打电话来说学历太低了不符合要求,建议投荣耀,结果荣耀也投了一定水花没有,非本211硕
投递华为等公司10个岗位
点赞 评论 收藏
分享
周述安:这都能聊这么多。别人要是骂我,我就会说你怎么骂人?他要是继续骂我,我就把评论删了。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务