牛客题-链表内区间反转

链表内区间反转

这是代码

c 复制代码
typedef struct ListNode listnode;
struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) {
    if (head == NULL) {
        return NULL;
    }
    listnode* findhead = head;
    listnode* findtail = head;
    listnode* prev = NULL;
    int count1 = m;
    int count2 = n;
    for (int i = 1; i < count1; i++) {
        prev = findhead;
        findhead = findhead->next;
    }
    for (int j = 1; j < count2; j++) {
        findtail = findtail->next;
    }
    listnode* p1 = findhead;
    listnode* p2 = p1->next;
    listnode* p3 = p2->next;
    while (p1 != findtail) {
        p2->next = p1;
        p1 = p2;
        p2 = p3;
        if (p3) {
            p3 = p3->next;
        }
    }
    if (prev) {
        prev->next = p1; 
    } else {
        head = p1; 
    }
    findhead->next = p2; 

    return head;
}

这道题我们的思路是先找到要反转的区间的范围,在通过改变链表指针的指向来反转链表,在把反转链表的头节点和尾节点与原链表相连,我们来画图看看

我们这里通过两个for循环来找到了区间,找m的时候需要存储上一个节点,因为我们要反转完链表之后,需要把新反转的链表链接到原链表上 所以要创建一个prev变量来存放上一个节点。接下来就是反转链表了,p1就是反转链表的头节点我们要用一个while循环来控制p1当p1不等于要反转的区间的尾节点,这里个反转链表的思路是重点。




接下来就是链接链表了,这时候我们反转完的头节点应该是p1我们就把我们存放的prev节点的下一个节点->p1

然后把我们原来的头节点2的下一个节点指向p2.

这样我们就完成反转了,

c 复制代码
if (prev) {
        prev->next = p1; 
    } else {
        head = p1; 
    }

这段代码就是判断特殊情况的,当prev为空的时候,就证明这个反转区间就是从链表头开始的,链表头节点就是反转链表的开始。

相关推荐
@小码农6 小时前
202512 电子学会 Scratch图形化编程等级考试三级真题(附答案)
服务器·开发语言·数据结构·数据库·算法
报错小能手7 小时前
数据结构 字典树
开发语言·数据结构
XLYcmy7 小时前
高级密码生成器程序详解:专门设计用于生成基于用户个人信息的密码猜测组合
开发语言·数据结构·python·网络安全·数据安全·源代码·口令安全
AI科技星8 小时前
时空的固有脉动:波动方程 ∇²L = (1/c²) ∂²L/∂t² 的第一性原理推导、诠释与验证
数据结构·人工智能·算法·机器学习·重构
2401_841495648 小时前
【LeetCode刷题】寻找重复数
数据结构·python·算法·leetcode·链表·数组·重复数
Joe_Blue_028 小时前
Matlab入门案例介绍—常用的运算符及优先级
开发语言·数据结构·matlab·matlab基础入门案例介绍
C雨后彩虹9 小时前
二维伞的雨滴效应
java·数据结构·算法·华为·面试
一路往蓝-Anbo9 小时前
C语言从句柄到对象 (八) —— 当对象会说话:观察者模式与事件链表
c语言·开发语言·数据结构·stm32·单片机·观察者模式·链表
youngee119 小时前
hot100-60子集
数据结构·算法
郝学胜-神的一滴9 小时前
Linux线程属性设置分离技术详解
linux·服务器·数据结构·c++·程序人生·算法