leetcode 92 反转部分单链表

2018-02-10  本文已影响26人  吃个小烧饼

先解释一下这个题,就是指定一个范围,把这个范围内的数反转。比如2->1->5->4->3->null,反转(2,4):2->4->5->1->3->null

首先是要注意限制,那么如果表为空,返回self;而数字上的限制,因为已经说明:

Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.

所以不用考虑m>n啊之类的问题。于是只用控制一个量,就是m==n,因为m到结尾也最多是m==n,不需要做太多控制。
代码如下:

ListNode* reverseBetween(ListNode* head, int m, int n) {
    if(head == nullptr || m==n)
        return head;
    //快速创建一个,设为0,next指向原链表
    ListNode *newList = new ListNode(0);
    newList->next = head;
    ListNode *pre = newList;
    for(int i = 1; i < m; ++i)
        pre = pre->next;
    ListNode *cur = pre->next;
    ListNode *tmp = nullptr;
    for(int i = 0; i< n - m; ++i) {
        tmp = cur->next;
        cur->next = pre;
        pre = cur;
        cur = tmp;
    }
    return newList->next;
}

我们可以看出,反转链表的核心操作都是中间那4句话,i.e.,后边的指向后边,当前后边的指向前边,前边的指向当前,当前指向后边。

上一篇下一篇

猜你喜欢

热点阅读