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

链表内指定区间反转

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

双链表法

区间内反转采用双链表法,与全体翻转不同的是,pre初始应指向区间右侧下一个结点,且翻转完成后,区间左侧前一个结点应指向pre。所以先遍历一遍链表,对指针遍历初始化。最后注意区间边界是开头和结尾的情况即可。

C++代码:

class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        ListNode *l, *pre, *p, *t = head;
        for (int i = 1; i <= n + 1; i++) {
            if (i == m - 1) {l = t;}
            if (i == m) {p = t;}
            if (i == n + 1) {pre = t;}
            if (t == NULL) break;//注意n为链表长度时,不跳出下一步会段错误。
            t = t->next;
        }
        for (int i = m; i <= n; i++) {
            t = p->next;
            p->next = pre;
            pre = p;
            p = t;
        }
        if (m != 1) {l->next = pre;}
        else {head = pre;}//注意左边界
        return head;
    }
};
全部评论

相关推荐

蚂蚁 基架java (n+6)*16 签字费若干
点赞 评论 收藏
分享
点赞 评论 收藏
分享
昨天 22:34
已编辑
重庆邮电大学 Java
快手 客户端开发 (n+5)k*16 公积金12
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务