首页 > 试题广场 >

链表操作

[单选题]
某单链表有5个元素,设单链表的节点结构为(data,next),5个元素的data依次为(1、2、3、4、5),已知指针q指向节点3,指针p指向节点4,那么下面操作能将链表变为data依次为(1、2、3、5)的是____。(其中temp为节点类型指针,默认指向NULL)
  • q=p->next;
  • p=q->next;
  • p->next=q->next;
  • q->next=p->next; delete q;
  • p->data=p->next->data; p->next=p->next->next; delete p->next;
  • temp = p->next; p->next=temp->next; p->data=temp->data; delete temp;temp=NULL;
推荐
这个题最大的问题就是E,F选项,E选项因为p->next=p->next->next;,所以指向了一个p->next一个不确定的空间,而第5个节点又没有释放,会导致内存泄露,F选项temp是一个确定的空间,不会出现什么问题
编辑于 2015-08-25 10:28:27 回复(16)
我觉得应该是刚给p->next 赋值之后又删除了
发表于 2021-11-25 16:35:35 回复(0)
这个问题一般会先考虑删除节点p
但答案中没有合适的删除节点p的操作,最接近的选项D应该改为q->next=p->next,且删除p才正确
因此我们考虑第二种思路
把p节点数据域的内容改成下一个节点的内容,由4改成5,再删除p后面那个节点5
选项E和F符合我们的思路
考虑E选项,我们发现前面指针变换都是对的,但是删除节点时发生了错误
因为p->next已经在前面改过了,这样造成的后果就是删除的是节点6而不是节点5
发表于 2015-09-09 11:14:36 回复(3)
Ze头像 Ze
二种方案 一种是直接连接数据域为5结点,另一种是将数据域为4结点的值进行更新
第一种的代码 
q->next = p->next; p->next = null; delete p; (所以D答案错误, 应删除p)

第二种代码
p->data = p->next->data; delete(p->next);p->next = null; 
这样既可 F答案只是将p->next用temp代替 所以即为
temp = p->next; p->next = temp->next;(其实直接指为空就好) p->data = temp->data; delete(temp); temp = NULL;
发表于 2015-08-31 20:27:52 回复(3)

E的错误在于,因为p->next被更新为p->next->next,也就是null,那么delete p->next,也就是delete null,这是会报错的。


编辑于 2020-03-01 23:24:26 回复(0)
单链表的删除操作:对指针;对数据,若在末尾,还要考虑尾指针为空。

有两个思路:
第一,删掉4所在结点:,5所在结点作为3的后继结点,即:q->next=p->next;q->next->next=null;delete p;(D选项没有给终端结点的指针赋‘0’)
第二,把4所在结点的数据替换成5,删掉5所在结点,即:临时指针变量temp,temp=p->next;p->naxt=   temp->next(null);p->data=   temp   ->data;
delete temp;temp=null;
E选项,在执行p-next=p->next->next(null)之后,再delete p->next.就是null。
编辑于 2017-03-31 10:36:55 回复(2)
E选项的最大问题是最后delete p->next,这时候的p->next已经变成5了,所以错误,正确答案为F
发表于 2015-08-25 10:54:18 回复(0)
这个题有问题,明明删除的是4节点,非要指到5上去,而且q也没用,真是醉了
发表于 2015-10-17 10:02:24 回复(2)
比如节点3(q)、4(p)、5的地址分别是100、200、300。 即: (q)|_3_|200|—>(p)|_4_|300|—>|_5_|^| 第一步:temp成为了300处的节点5了,相当于给节点5起了一个叫temp的小名。 第二步:因为题目里说了temp—>next是^(空指针),所以是将p—>next赋值为空指针。也就是上图中的300变为了^,后面不再连节点5。但它是还仍然是temp,我们叫一声temp,节点5就答应。 第三步:注意到p的数据还是4,所以再将temp里面的5赋给p的data。p的data成为了5,4就是这么没的… 第四步:4没了,p后面也空了。那temp就得告退了。delete temp,也就是曾经的节点5 ,自此完全退出了历史舞台。
发表于 2021-10-23 11:35:19 回复(0)
E答案的问题,在于,p->next=p->next->next,这样就丢失了原本元素5所在储地址的指针,此后不可能对该地址访问,出现了内存泄漏。
编辑于 2017-08-20 20:03:51 回复(0)
p指向结点4,不意思是说结点3的指针为p吗?
发表于 2017-03-16 10:32:28 回复(0)
答案因该是p->data=p->next->data; p->next=p->next->next; delete p->next;
F选项输出的结果为1 2 4 5
发表于 2015-08-25 00:21:03 回复(0)
这题E的错误在于,p->next被更新为p->next->next后,delete p->next会报错,因为p->next已经为null了,不能在执行delete操作
发表于 2022-07-20 10:48:23 回复(0)
把原先4结点的内容变为5,再把原来5的结点删去。
发表于 2015-08-24 23:18:30 回复(0)
什么够吧题,给了个q不用非得用过temp,那你干脆就只给个p算了
发表于 2023-04-09 16:40:06 回复(0)

画了个示意图,如果画错了还望大佬指正,我也是重新学习。
发表于 2022-12-24 23:03:38 回复(0)
nice题!
发表于 2022-04-22 09:40:45 回复(0)
首先考虑删除节点p
q->next = p->next; p->next = null; delete p;
其次考虑将p->data由4改成5,再删除p后面那个节点
p->data = p->next->data; delete(p->next);p->next = null; 
答案F只是用temp代替 p->next,也就是表明,temp指向节点5
temp = p->next;
p->next = temp->next; // p->next = p->next->next;
p->data = temp->data; // p->data = p->next->data;
delete temp;                 // delete p->next;
temp = NULL;              //  p->next = NULL;
即:
p->next = p->next->next;p->data = p->next->data;delete p->next;p->next = NULL;
编辑于 2020-02-21 15:57:54 回复(0)
唯一没看懂的地方 p–>data =temp–>data 这个地方没看懂
发表于 2020-02-06 10:05:17 回复(0)
把delete q看成delete p了。。。
发表于 2019-11-21 15:03:40 回复(0)
很赞的题目
发表于 2019-10-10 10:32:22 回复(0)