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

链表内指定区间反转

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 广东

相关推荐

hanliu:1. 排版与格式问题字体与对齐问题:标题和内容的字体大小差异不够明显,无法迅速吸引目光。某些文字看起来有些拥挤(比如校园经历中的“班委成员”部分)。2. 内容逻辑性模块顺序问题:实习经历放在较靠后的位置,实际上这部分内容对应聘来说更重要,建议提前突出。细节表述不够突出:比如教育背景部分的专业课程仅仅列出名字,没有说明自己在这些课程中表现如何或者掌握了什么技能,缺乏量化描述。多余内容:例如“班委成员”和“宣传委员”这类校园经历,叙述过于普通,缺乏和岗位相关的实质性贡献。,建议简写。3. 措辞专业性表达不够精准:例如“协助班长与团支书更好地为同学服务”显得较为笼统,没有实际成果的体现。用词重复:如“学习了焊接”“学习了光检”等重复词语较多,缺乏丰富的动词来展示个人能力(如“负责”“优化”“改进”等)。技能展示不足:虽然列出了UG和CAD证书,但没有明确提到这些技能如何在实际工作中发挥作用。4. 技能匹配度技能深度不足:虽然列出了掌握的软件和技术,但没有描述技能水平(如“熟练掌握”“精通”),也没有具体案例支持这些技能。缺乏岗位导向性:比如针对机械设计与制造方向,实习经历提到了“E6尾灯项目”,但没有详细说明自己在其中的技术贡献,可能会显得经验描述泛泛而谈。5. 自我评价问题表达空泛:如“具有良好的沟通协调能力”“责任心强”之类的描述太常见,没有让人眼前一亮的特点。缺乏成果支持:自我评价中的能力没有用具体项目、经历或成就来验证,可信度较弱。 兄弟加油
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务