跨考大连海事计算机,大连海事大学计算机考研——编程题

前言:细分的小步骤,总结下分类说说。

1.找到第n/2个元素。(n无限大)

q = L->next; p=L-next; //L表示带表头的单链表

while(p){

if(q->next) q = q->next->next;

else { q = q->next;break ; }

p=p->next;

}

/*分三种情况:

①n为奇数,q->next=null;p移动 n/2 次到达中间位置

②n为偶数,q->next->next=null;p移动( n/2)次到达中间位置

③n = 0;执行else,都不动,跳出循环。

*/

2.将第k个元素后面的元素逆置。

(尾插法)//从倒数第k个元素操作

p->k; //p指向第k个元素

p->next = null; //①断链

q = p->next;

s = q->next;

9a163ce0efb4775c7a957073f8b36227.png

while(s)

{

q->next = p->next; //先指过去

p->next = q; //再指过来

q=s;

s=s->next;

}

//思路不同,代码也不同,都是对的,下面是另一种写法

//(尾插法)从倒数第k-1个元素操作

q = p->next->next;

p->next->next=null;

4d79ade8ca27804c672d385185a019ce.png

while(q)

{

s=q->next;

q->next = p->next;

p->next = q;

q=s;

}

3. 第k个元素后面的偶(奇)数节点全部删除。

int s,p,q;

p=k; //假设p指向第k个元素

s=p;

q=p->next;

(没有那种笔,鼠标画图太麻烦了,还是手画吧)

680e0573d8a3bffd841fe272b393196f.png

while(q){

if(q->data mod 2 == 0) //如果q为偶数

{

p=q; //为了释放这个空间,让p=q

s->next = q->next; //删除q节点

q = q->next; //q下移一位

free(p);

}

else{

s=q;

q= q->next; //是奇数直接下移,不用管p,有问题执行上面的。

}

}

4.奇数节点全部在偶数之前,不改变先后次序。

Linklist p,q,s,r,t; //带表头(L)节点的单链表

r = L; p = L->next; q=null; t=null;

af6b9b71282dac350575ca5bfd400dd9.png

while(p)

{

if(p->data mod 2 = 0){

s=p; //找个替身,方便以后移动

r->next = p->next; //删除p节点

p=r;

/*

①第一位是偶数,p=r=L ; 下面执行p=p->next; p始终在L的后面一位。

②第n位是偶数,前面n-1位是奇数,r执行n-1次r=r->next;

r 始终在p的前面一位。

*/

s->next=null;

if(!q){ q=s; r=s; } //如果q为空

else{ t->next = s; t=s;} //如果q不为空,t先指过去,自己再过去

}else{//如果是奇数r=r->next;}

p=p->next; //是奇数,rp同时下移;是偶数,元素被删,p=r,p后移一位。

}//while

/* 此时偶数q打头,t结尾。奇数r结尾。*/

r->next= q; //奇数在偶数之前

5.在n个元素的带头单链表中找倒数第k个元素(n趋于无穷大)。

(注:思路不难,考的主要是对k合法性的判断)

Linklistpre,p;

inti = 0;

if(k<=0) { printf("判定1:输入的k值不合法"); return; }

pre = L->next; p = L->next; //都指向第一个元素

if(!p) { printf("判定2:链表为空"); return; }

while(p && i

p = p->next; //p从第一个开始,因此i

i++; //如果k的值大于表长,p=null执行结束,i为表长

}//while

if(i

while(p){

//此时pre为第一个,p为正数第k个

p = p->next;

pre = pre ->next;

}//while

printf("%d,\n",pre->data);

后记:这只是基础的几个思路,后续还有一些,有时间慢慢补充上。

b60305ce8b8452b3890c1824240f1903.png

举报/反馈

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值