leetcode92. 反转链表 II

题目

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

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

示例:

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

思路

一般都是用迭代或者递归,由于递归比较难以理解,因此笔者一般选择迭代。

下面参考力扣官方详解。

原先:1->2->3->4->5->null
需要反转的位置:m=2,n=4

反转的地方链表顺序变为:2<-3<-4

连接原先的链表和反转后的链表:将1连接到4,将2连接上5

:1->4->3->2->5->null

总结:分为两部分,一部分是需要反转的节点,则在链表内部反转即可;一部分是不需要反转的节点,那么承担着连接的任务,连接上反转后的节点。

代码

class Solution {
public:
    ListNode* reverseBetween(ListNode* head, int m, int n) {
        //由于没有哨兵节点,因此需要判断头节点是否为空的情况
        if(head == NULL) return NULL;

        //move移动到需要反转的地方
        ListNode* pre = NULL, * cur = head;
        while(m > 1){
            pre = cur;
            cur = cur->next;
            m--;
            n--;
        }

        //rotate反转
        ListNode* con = pre, * tail = cur;
        while(n > 0){
            ListNode* tmp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = tmp;
            n--;
        }

        //为了让[3,3] m=1,n=1 ; [3] m=1,n=1的情况也列入其中
        if(con != NULL){
            con->next = pre;
        }else{
            head = pre;
        }
        tail->next = cur;
        return head;
    }
};

tips:可以参考将以下几种情况按照代码的流程走一遍,方便理解。

[1,2,3,4,5] m=2,n=4

[2,3] m=1,n=1

[2] m=1,n=1

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页