反转链表m-n项

#include<iostream>
#include<queue>
#include<stdio.h>
#include<string>
using namespace std;
struct listnode {
    int val;
    struct listnode* next;
};
    //链表的指针域,存储的是指向下个结点的指针,是指针
    //指针指向的是结点,结点用指针来表示,当前结点用当前结点指针cur指示
    //一块内存空间,存储结点的地址,两个这样的指针空间就可以访问链表的所有结点
    //通过不断改变这块空间所存储的结点地址,指针的内存空间没有动,链表的内存空间也没有动
    //动的是指针内存空间上所存储的地址值
    // 每个链表的内存空间都存储两个值,一个是要存储的值,一个是下个指向下个结点的指针
    // cur->val可以读取值,cur=cur->next可以访问到下个结点
    //如果要删改链表,通过对指向对应结点的指针做改变就可以
    //因为指针指向要更改的空间,通过指针,就直接对空间做出了改变

int m, n;
listnode* func(listnode* head, int m, int n) {
    listnode* res = new listnode(-1);//在堆区创建了一个结点指针,用来指向结点
    res->next = head;//这里的res,head,cur,pre都是指向结点的指针,也可代表指向的结点,因为通过他们就可以访问到对应的结点
    listnode* cur = head;//head是头节点,也是第一个结点
    listnode* pre = res;
    for (int i = 1; i < m; i++) {
        pre = cur;
        cur = cur->next;//从第一个结点到第M个结点,共需m-1次方法,如从第一个到第二个,需1次
    }//此时,cur指向第m个结点的空间
    //把M到n实现反转,就是从第M+1个结点开始,不断把结点放在第M个结点的位置
    //就是不断头插,把之前的不断往后挤,这样从M出现的就是离初始m最远的那个结点
    //每次循环就是把最初的第m个结点(离第M号位置越来越远)的下一个结点放在pre前面
    //直到那个最初的结点(cur)到达最远位置,即第N号位置
    //即涉及三个结点,cur,cur->next(要移到最前面的结点),pre->next(要移到的位置)
    //首先就是要让cur->next指向cur->next->next,避免cur->next移动后使cur找不到下个结点的位置,即相当于无法让cur后移
    //如果直接写上式就会导致cur->next丢失,即相当于被删掉了,所以应用临时指针保存一下那个结点
    //接着让那个结点的next是原本的pre->next
    // 再让pre->next=那个结点
    // 就完成了把那个结点头插到pre的后面
    // 实际上整个过程动的只有那个结点和cur,pre
    // 那个结点的前驱和后驱都发生了改变,前驱变为pre,后继变为原本的pre->next
    // pre的后继改成了那个结点,cur的后继改成了原本那个结点的后继
    // 循环就是不断重复这个过程
    //
    for (int i = m; i < n; i++) {
        listnode* temp = cur->next;
        cur->next = temp->next;
        temp->next = pre->next;
        pre->next = temp;
    }
    return res->next;//在这个过程中,pre,cur不断变化,头结点head没变
    //res也没变,res->next始终指向这个链表的头结点
}
int main()
{
  
    
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值