题解 | #链表内指定区间反转#

链表内指定区间反转

https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* reverseBetween(ListNode* head, int m, int n) {
       ListNode* p1 = head;
       ListNode* p2 = nullptr;
       ListNode* preverse = nullptr;
        //头部插入一个结点
        ListNode* newnode = new ListNode(0); 
        newnode->next = p1;
        p1 = newnode;
        head = p1;
        //尾部插入一个结点
        while(p1->next != nullptr)
        {
            p1 = p1->next;
        }
        newnode = new ListNode(0);
        p1->next = newnode; 
        p1 = head;
        m++;n++;
        for(int i=1; i < m-1; i++)
        {
            p1 = p1->next;
        }
        p2 = p1;
        p1 = p1->next;
        for(int i=0; i<n-m+1; i++)
        {
            newnode = new ListNode(p1->val);
            newnode->next = preverse;
            preverse = newnode;
            p1 = p1->next; 
        }
        p2->next = preverse;
        while(preverse->next != nullptr)
        {
            preverse = preverse->next;
        }
        preverse->next = p1; 

         p1 = head;
         while(p1->next->next != nullptr)
         {
            p1 = p1->next;
         }   
        p1->next = nullptr;
	  
        return head->next;        
    }
};

全部评论
你的代码中存在几个逻辑错误和不必要的复杂性。主要问题是你在处理反转链表部分时创建了新的节点,而实际上你应该直接在原链表上进行操作。此外,你在链表的末尾也错误地添加了一个新节点。以下是一个简化且修复了错误的版本: 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)。同时,它也简化了代码,使其更易于理解和维护。
点赞 回复 分享
发布于 2024-08-12 01:24 广东

相关推荐

抱抱碍事梨a:三点建议,第一点是建议再做一个项目,把自我介绍部分顶了,第二点是中南大学加黑加粗,第三点是建议加v详细交流
点赞 评论 收藏
分享
04-25 18:13
五邑大学 Java
后来123321:大二两段实习太厉害了,我现在大二连面试都没有
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务