Reverse Linked List II leetcode

本文详细介绍了如何在单链表逆置的基础上,通过引入范围判断来优化代码,采用二级指针进行操作,适用于追求效率的编程场景。文中包括关键步骤的代码解析,并强调了在编程前通过画图理清思路的重要性。

本题与之前单链表逆置不同的是,加入了范围判断。

依然沿用之前单链表逆置的方法,只需要再做好起始节点和末尾节点的判断

说起来容易,做起来复杂,特别是单链表,很容易把人搞晕,所以,在编程之前最后画图理清思路。

这次在头结点的处理上,不同于以往设置临时头结点的方法,使用了二级指针,这种方法写出来的代码可能比较少,但是不容易理解,对于追求效率的同学未尝不可一试

ListNode* reverseBetween(ListNode* head, int m, int n) {
    if (head == nullptr || head->next == nullptr)
        return head;
    int count = n - (m--) - 1;
    ListNode **pos = &head;
    while (m-- && (*pos)->next != nullptr)
        pos = &((*pos)->next);
    if ((*pos)->next == nullptr)
        return head;
    ListNode *currPos = (*pos)->next;
    ListNode *nextPos = (*pos)->next->next;
    ListNode *prevPos = (*pos);
    while (count-- > 0 && nextPos != nullptr)
    {
        // 改变currPos->next
        currPos->next = prevPos;

        // 依次更新prev、curr、next(向后移动)
        prevPos = currPos;
        currPos = nextPos;
        nextPos = nextPos->next;
    }
    if (count == -1) {
        currPos->next = prevPos; // 注意最后一步
        ListNode *temp = *pos;
        *pos = currPos;
        temp->next = nextPos;
    }
    return head;
}

 

转载于:https://www.cnblogs.com/sdlwlxf/p/5073860.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值