#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;
}
反转链表m-n项
最新推荐文章于 2024-05-22 10:59:33 发布