题解 | #牛群的重新排列#

牛群的重新排列

https://www.nowcoder.com/practice/5183605e4ef147a5a1639ceedd447838

考察的知识点:遍历链表、修改节点的指针指向;

解答方法分析:

  1. 首先,检查给定的链表头节点是否为空,以及 left 和 right 是否相等,如果相等,直接返回原链表头节点。
  2. 创建一个虚拟头节点(dummy),指向原链表的头节点,并创建指针 pre 指向虚拟头节点。
  3. 将 pre 移动到要反转部分的起始位置的前一个节点,即 pre 移动 left-1 次。
  4. 创建指针 cur 指向 pre 的下一个节点,即要反转部分的起始节点。
  5. 创建指针 next 指向 cur 的下一个节点,用于保存 cur 的下一个节点。
  6. 使用循环将链表部分进行反转,循环次数为 right-left。将 cur 的下一个节点指向 next 的下一个节点,完成反转。将 next 的下一个节点指向 pre 的下一个节点,建立反转后的指针连接。将 pre 的下一个节点指向 next,更新 pre 的指向。将 next 移动到 cur 的下一个节点,继续下一次反转操作。
  7. 返回虚拟头节点(dummy)的下一个节点,即为反转后的链表头节点。

所用编程语言:C++;

完整编程代码:↓

/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 *  ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @param left int整型
     * @param right int整型
     * @return ListNode类
     */
    ListNode* reverseBetween(ListNode* head, int left, int right) {
        if (left == right) {
            return head;
        }
        ListNode dummy(0);
        dummy.next = head;
        ListNode* pre = &dummy;
        for (int i = 1; i < left; ++i) {
            pre = pre->next;
        }
        ListNode* cur = pre->next;
        ListNode* next;
        for (int i = left; i < right; ++i) {
            next = cur->next;
            cur->next = next->next;
            next->next = pre->next;
            pre->next = next;
        }
        return dummy.next;
    }
};

全部评论

相关推荐

零OFFER战士:另一个版本查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务