首页 > 试题广场 >

给定下列C函数: 整数单链表作为参数,函数重新排列列

[单选题]

给定下面函数:整数单链表作为参数,函数重新排列列表的元素。

现以顺序为 1, 2, 3, 4, 5, 6, 7 的整数列表调用该函数
struct node
{
    int value;
    struct node *next;
};
 
void rearrange(struct node *list)
{
   struct node *p, * q;
   int temp;
   if ((!list) || !list -> next)
      return;
   p = list;
   q = list -> next;
   while(q)
   {
       temp = p -> value;
       p -> value = q -> value;
       q -> value = temp;
       p = q -> next;
       q = p ? p -> next:0;
   }
} 

函数执行后列表的内容是()

  • 1, 2, 3, 4, 5, 6, 7
  • 2, 1, 4, 3, 6, 5, 7
  • 1, 3, 2, 5, 4, 7, 6
  • 2, 3, 4, 5, 6, 7, 1
要点是看迭代是1个数字还是两个数字,
p = q -> next;
q = p ? p -> next:0;
题中是迭代两个数字,所以D错误,B正确
发表于 2020-08-11 16:18:02 回复(0)
这道题可以看成链表操作,一开始p指向链表第一个,q指向链表第二个,进入while第一次循环,执行值交换,p = q -> next后,p指向链表第三个,q此时还是链表第二个,q = p ? p -> next:0; q不等于p,q=0;跳出循环,只执行一次循环,答案应该是2,1,3,4,5,6,7
发表于 2021-04-20 09:58:04 回复(7)

执行函数rearrange后,原链表的每两个相邻节点的值都会交换位置。因此,顺序为 1, 2, 3, 4, 5, 6, 7 的整数列表在执行完rearrange后,其元素的顺序会变为 2, 1, 4, 3, 6, 5, 7。具体过程如下所示:

  1. 初始化 p 和 q 分别指向链表的第一个和第二个节点(即 1 和 2)。
  2. 交换 p 和 q 节点的值,即将 1 和 2 交换。
  3. 将 p 指针后移一位,指向链表的第三个节点(即 3)。
  4. 如果 p 指针已经为空,则退出循环;否则,让 q 指向 p 的下一个节点。
  5. 重复步骤 2 到 4,直到 p 指针为空。

因此,执行完rearrange函数后,链表的元素顺序变为 2, 1, 4, 3, 6, 5, 7。

发表于 2023-10-19 16:45:53 回复(0)
<p>if((!list)这里不是跳出去了吗,下面代码没执行呢</p>
发表于 2020-09-09 16:17:42 回复(1)
发表于 2022-09-04 08:33:30 回复(0)
如果选D的话,while循环最后一行的代码没有存在的必要
发表于 2022-01-11 20:11:59 回复(0)
注意的是temp是int,只做了值的交换,没有修改指针指向
发表于 2020-10-19 01:19:21 回复(0)
先交换里面的变量值,然后再整体移动一个节点,循环到q为空
发表于 2023-08-06 02:33:52 回复(0)
根据题目算法,就是相邻的两个指针交换值,p开始指向第一个元素,q指向p的下一个元素,交换第一和第二元素值,两个数交换完,p = q->next也就是第三个元素,q  = p->next指向第四元素,交换第三和第四元素的值,while循环依次交换知道指向末尾
发表于 2022-03-24 00:47:40 回复(0)
不太理解三元判断 p=q而不是==
发表于 2023-10-08 00:11:30 回复(0)