你的代码中存在几个逻辑错误和不必要的复杂性。主要问题是你在处理反转链表部分时创建了新的节点,而实际上你应该直接在原链表上进行操作。此外,你在链表的末尾也错误地添加了一个新节点。以下是一个简化且修复了错误的版本: cpp class Solution { public: ListNode* reverseBetween(ListNode* head, int m, int n) { // 添加一个哑节点(dummy node)作为新链表的头部 ListNode* dummy = new ListNode(0); dummy->next = head; ListNode* prev = dummy; // 移动 prev 到第 m-1 个节点 for (int i = 1; i < m; ++i) { prev = prev->next; } ListNode* curr = prev->next; ListNode* nextTemp = nullptr; // 反转第 m 到第 n 个节点 for (int i = m; i <= n; ++i) { nextTemp = curr->next; curr->next = nextTemp->next; nextTemp->next = prev->next; prev->next = nextTemp; } return dummy->next; } }; 解释: 添加哑节点:添加一个哑节点(dummy node)作为新链表的头部,这样可以简化边界条件的处理,特别是当 m = 1 时。 找到第 m-1 个节点:使用 prev 指针遍历链表,直到它指向第 m-1 个节点。 反转第 m 到第 n 个节点:使用三个指针 prev, curr, 和 nextTemp 来反转链表中的指定部分。nextTemp 用来临时存储 curr->next,然后更新 curr->next 和 nextTemp->next 来实现反转。 返回结果:由于我们使用了哑节点,所以最终返回 dummy->next 作为反转后链表的头节点。 这种方法避免了在反转过程中创建新的节点,从而保持了空间复杂度为 O(1)。同时,它也简化了代码,使其更易于理解和维护。
点赞

相关推荐

EEbond:给北邮✌️跪了
点赞 评论 收藏
分享
牛客网
牛客企业服务