2021/01/06
项目场景:1213题,用尾插法构造单链表 问题描述:为了在通过地址传递的方式,传递参数——头指针的情况下,维护头指针本身的不变性(对于有头结点的单链表而言,头指针始终指向头结点)。一般会将头指针赋值给一个临时指针,对这个临时指针进行操作而不是对头指针本身(起码王道和大话数据结构都是这样写的)。于是在用尾插法构造单链表,传入尾指针作为参数时也陷入了相同的思维定式。导致尾指针一直没有变化,而相比于头指针在构造单链表过程中,一直指向头结点,尾指针则一直是指向单链表的最后一个节点,因此,尾指针的指向性在构造单链表过程当中需要不断变化。
void insert(link &tail,int i){
link n=(link)malloc(sizeof(node));
n->next=NULL;//这一步必须有,从实践结果来看,对于自定义数据结构的指针
link t=tail;//域,C是不存在“默认为NULL”的设定的。所以建议构造一个
n->d=i;//初始化函数,否则在遍历单链表时就会出现问题,未赋值的结点
t->next=n;//指针域指向性是随机的,而不是默认为NULL
t=n;
}
解决方案:
void insert(link &tail,int i){
link n=(link)malloc(sizeof(node));
n->next=NULL;
//link t=tail;
n->d=i;
tail->next=n;
tail=n;
}
2021/01/07
项目场景:1217题,逆转部分单链表题目描述
反转长度为N的单链表从位置 L 到 R 的子段。请在常数空间复杂度下使用一趟扫描完成反转。
输入
第一行三个整数N,L,R,1<=L<=R<=N
接下来N个数表示N个节点的值
输出
输出反转后的单链表节点值
我的意思是通过遍历单链表,获取第L个节点前一个节点的指针,以及第R个节点的指针,并记录R+1个节点的指针
for(int i=1;i<=t;i++){
if(i+1==s) first=p;
if(i==t) second=p;
p=p->next;
}
但是这样写并不完备,因为如果L=1,那么我的first就没有被赋值
解决方案:
if(s==1) first=l; if(t==1) second=l;
加两行代码即可



