首页 > 试题广场 >

给定如下C程序,以下哪项选项能实现该函数的功能?

[单选题]
给定如下C程序:
typedef struct node_s{
    int item;
    struct node_s* next;
}node_t;
node_t* reverse_list(node_t* head)
{
    node_t* n=head;
    head=NULL;
    while(n){
	_________	             
    }
    return head;
 }
空白处填入以下哪项能实现该函数的功能?
  • node_t* m=head; head=n; head->next=m; n=n->next;
  • node_t* m=n; n=n->next; m->next=head; head=m;
  • node_t* m=n->next; n->next=head; n=m; head=n;
  • head=n->next; head->next=n; n=n->next;
推荐
B.node_t* m=n; n=n->next; m->next=head; head=m;
其余选项均不能满足反序链表的功能
编辑于 2015-02-05 11:50:56 回复(0)
答案是B木有问题,但是题目明显有问题啊,返回值怎么可能是void
发表于 2015-09-01 12:44:35 回复(4)
代码的功能是要实现链表的反转。为了方便阐述,每个结点用①②③④⑤⑥等来标示。
在执行while(n)循环之前,有两句代码:
node_t* n=head;
head=NULL;
这两行代码的中:第一句的作用是用一个临时变量n来保存结点①,第二句是把head修改为NULL。
然后就开始遍历了,我们看到while循环里的那四句代码:
node_t* m=n; 
n=n->next; 
m->next=head; 
head=m;
先看前两句,用m来保存n,然后让n指向n的下一个结点,之所以复制 n 给 m ,是因为 n 的作用其实是  控制while循环次数  的作用,每循环一次它就要被修改为指向下一个结点。
再看后两句,变量head在这里像是一个临时变量,后两句让 m 指向了 head,然后 head 等于 m。

实际演示一遍,在while循环之前,n指向①,Head(起一个临时变量的作用)被修改为NULL。
  1. m被赋值为n(结点①),n由指向结点①变成了指向结点②,m(结点①)指向head(NULL),head接着被赋值为结点①。(①指向NULL
  2. m被赋值为n(结点②),n由指向结点②变成了指向结点③,m(结点②)指向head(结点①),head接着被赋值为结点②。(②指向①
  3. m被赋值为n(结点③),n由指向结点③变成了指向结点④,m(结点③)指向head(结点②),head接着被赋值为结点③。(③指向②
  4. m被赋值为n(结点④),n由指向结点④变成了指向结点⑤,m(结点④)指向head(结点⑤),head接着被赋值为结点④。(④指向③
  5. m被赋值为n(结点⑤),n由指向结点⑤变成了指向结点⑥(结点⑥是NULL,意味着这是最后一次循环),m(结点⑤)指向head(结点⑥),head接着被赋值为结点⑤。(⑤指向④
以上就是整个代码的过程。希望对你有所帮助。
编辑于 2018-05-07 17:04:53 回复(3)
例如:head->A->B->C->NULL
m,n=head,head=NULL; 
m->next=head : NULL
m->next=head : A-> NULL
m->next=head : B-> A-> NULL
m->next=head : C-> B-> A-> NULL
答案B
编辑于 2017-04-27 12:35:32 回复(1)
<p>这个算法写得好难懂...头插法的基本思想遍历链表,</p><p>然后将新节点不断从头节点后插入,不就反转链表了吗</p>
发表于 2020-10-31 17:12:56 回复(0)
这种还是可以用笔画一画,更直观一点!
发表于 2019-09-28 11:20:37 回复(0)
啥头像
C是错的,有逻辑错误
最后两句应该颠倒一下;   改成head=n; n=m;  。不然修改了n再把n赋给head就错了
发表于 2016-01-05 10:30:04 回复(1)
A哪里错了?
发表于 2015-07-13 12:47:13 回复(1)
一个头插解决的事,搞得这么复杂
发表于 2021-12-12 00:24:04 回复(0)

A与B的区别在于是否在最后将head放在了头上
发表于 2020-02-22 11:11:14 回复(0)
功能:链表反转  进入while 循环之前 n指向第一个节点head的地址  然后head用来构建一个空Null
第一次while循环,
node_t* m=n;//m ,n指向第一个节点A
n=n->next; //n指向下一个节点
m->next=head; //m反指向head,记得吗,head这时候是NULL
head=m;// 现在 head 移到m上
第一次完毕排好了 A->Null 

发表于 2018-04-13 15:44:45 回复(0)
这程序的功能是啥?
发表于 2018-03-21 19:49:55 回复(0)
A项执行 head->next=m后 链表断了, n=n->next无法正确执行
发表于 2015-10-09 19:57:01 回复(0)
D怎么错了??

发表于 2016-10-18 09:47:05 回复(1)
这里不带头结点
发表于 2019-10-19 17:07:22 回复(0)
头插法反转链表
发表于 2018-10-25 22:39:22 回复(0)
头插法
发表于 2018-10-05 00:04:49 回复(0)
A为什么不对呢?
发表于 2017-06-18 22:02:43 回复(1)
比链表为无头节点链表
发表于 2016-10-09 15:50:14 回复(0)
题目中,第8句写的没问题?
发表于 2016-07-25 10:53:22 回复(0)
注意链表的反转的指针变换

发表于 2016-04-28 19:53:37 回复(0)