LeetCode 92. 反转链表 II

反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。

说明:
1 ≤ m ≤ n ≤ 链表长度。

1 , 2, 3, 4 , 5 m=2,n=4
p tail item

1 , 3 , 2 , 4 , 5
p tail item

1 , 4, 3 , 2 ,5
p tail

先找到第m节点的前一个节点用p来表示 ,在找到第m节点用tail来表示,在找到第m节点的后一个节点用item来表示,每次把item节点也就是tail的next节点移动到p节点的后面,一直循环就可以来,永远不改变tail,一直往后顶。

示例:

输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL


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

struct ListNode* reverseBetween(struct ListNode* head, int m, int n) {

    struct ListNode h = {0,head};
    struct ListNode * p = &h;
    struct ListNode * tail;
    if(m==n){
        return head;
    }
    for(int i=1;i<=n;i++){
        if(inext;
        }else if(i==m){
            tail = p->next;
        }else{
            struct ListNode * item = tail->next;
            // 1 2 3 4 5
            tail->next = tail->next->next;
            item->next = p->next;
            p->next = item;
        }
    }
    return h.next;
}

你可能感兴趣的:(LeetCode 92. 反转链表 II)