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

链表内指定区间反转

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

```/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param head ListNode类 
 * @param m int整型 
 * @param n int整型 
 * @return ListNode类
 */
struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) {
    // write code here
    struct ListNode *The_M_p, *The_Mminus1_p; // 声明两个指针变量;一个是第m-1个结点,一个是m个结点;
    The_M_p = head; The_Mminus1_p = head; // 为什么要两个呢?因为改变链表后,结点地址自然也就改变1;
    for(int i = 1; i < m-1; i++) {  // 而最后要将改变的地址两端重新衔接上;
        The_Mminus1_p = The_Mminus1_p->next;
    }
    
    if(m != 1) The_M_p = The_Mminus1_p->next; // 这里是若m == 1时的情况,m==1情况特殊;
    else The_M_p = head;                    // 我定义The_M_p 和 The_Mminus1_初始地址相同,均为head;
                                            // 所以m==1时,The_M_p也应该等于head;    
    struct ListNode *The_N_p, *The_Nadd1_p; // 第n个值同理,只不过,这时是第n个 和 第n+1 个,
    The_N_p = head; The_Nadd1_p = head;  // 不过我这个程序不用while语句,所以只用第n+1个, 用来衔接;
    for(int i = 1; i < n; i++) {
        The_N_p = The_N_p->next;
    }
    // m to n 逆序;用无头结点的头插法即可;
    The_Nadd1_p = The_N_p->next;
    struct ListNode *q, *p, *record;
    record = The_M_p;// 记录第m个结点的地址;地址地址地址,//狭义的理解:结点的地址不会改变;
    q = The_M_p;
    for(int i = m-1; i < n; i++) { // Notice: 这个是循环(n-m+1)次,因为刚开始是自身交换哦//(
        q = The_M_p;
        The_M_p = The_M_p->next;
        q->next = p;// 头插法 //核心代码
        p = q;      // 头插法 //核心代码
    }
    if(m == 1) {  // m == 1 是个特殊的情况;
        head = p;  // 因为m == 1时,The_M_p == The_Mminus1_p == record == 首元结点的地址;
    } else {
        The_Mminus1_p->next = p;
    }
    record->next = The_Nadd1_p;
    return head;
}

/*
 {1,2,3,4,5} 2,4;
 1 -> 2 -> 3 -> 4 ->5;
 //head.val = 1;
 //The_Mminus1_p.val = 1;
 //The_Nadd1_p.val = 5;
 交换2 -> 3 -> 4; Notice: 1 -> 2  & 4 -> 5哦;
 头插法交换完后:|----未知(因为没有给分配,详见line36)
 1   4 -> 3 -> 2   5
 |-------------|(1 -> 2;
 所以这时要把m 和n处衔接上;
 就是line45 to line50;
 
 {1,2,3,4,5} 1,3;
 这个例子特殊,
 因为m == 1;
 可以自己推一下试试;
 
 综上所述:我的题解就讲完了,第一次发题解,望见谅;;
*/
全部评论
给自己一个赞;
点赞 回复 分享
发布于 2022-03-15 20:17

相关推荐

2025-12-15 11:27
门头沟学院 Java
哇哇的菜鸡oc:所有人不要理会,就好了,后面他就知道怎么回事了,只能说有的时候市场都是被宰的人搞坏的
点赞 评论 收藏
分享
行云流水1971:这份实习简历的优化建议: 结构清晰化:拆分 “校园经历”“实习经历” 板块(当前内容混杂),按 “实习→校园→技能” 逻辑排版,求职意向明确为具体岗位(如 “市场 / 运营实习生”)。 经历具象化:现有描述偏流程,需补充 “动作 + 数据”,比如校园活动 “负责宣传” 可加 “运营公众号发布 5 篇推文,阅读量超 2000+,带动 300 + 人参与”;实习内容补充 “协助完成 XX 任务,效率提升 X%”。 岗位匹配度:锚定目标岗位能力,比如申请运营岗,突出 “内容编辑、活动执行” 相关动作;申请市场岗,强化 “资源对接、数据统计” 细节。 信息精简:删减冗余表述(如重复的 “负责”),用短句分点,比如 “策划校园招聘会:联系 10 + 企业,组织 200 + 学生参与,到场率达 85%”。 技能落地:将 “Office、PS” 绑定经历,比如 “用 Excel 整理活动数据,输出 3 份分析表;用 PS 设计 2 张活动海报”,避免技能单独罗列。 优化后需强化 “经历 - 能力 - 岗位需求” 的关联,让实习 / 校园经历的价值更直观。 若需要进一步优化服务,私信
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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