首页 > 试题广场 >

在一个长度为 n ( n1 )的单链表上,设有头和尾两个指

[单选题]
在一个长度为 n n>1 )的单链表上,设有头和尾两个指针,执行()操作与链表的长度有关。
  • 删除单链表中的第一个元素
  • 删除单链表中的最后一个元素
  • 在单链表第一个元素前插入一个新元素
  • 在单链表最后一个元素后插入一个新元素
尾指针是在最后一个元素的后面一个位置
发表于 2017-10-25 21:09:21 回复(1)
A
头指针是指向第一个元素(结点)的指针。
删除单链表中的第一个元素时只需要将头指针指向第二个元素,然后释放第一个元素储存空间申请的内存。与链表长度无关。
ListNode *temp = head->next;
head->next = temp->next;
free(temp);
B
尾指针是指向最后一个元素(结点)的指针,与头指针类似。
删除单链表中的最后一个元素时 由于不是双向链表,所以要从头指针开始,一直遍历直到倒数第二个元素,将倒数第二个元素(结点)指向NULL,释放原末端元素(结点)空间后,将尾指针等于新的末端元素(结点)。所以与链表长度有关。
ListNode *p = head;
while(p->next != rear) p = p->next;
p->next = NULL;
free(r);
r = p;

C
在单链表第一个元素前插入一个新元素时,只需要把新的元素(结点)指向原来的第一个元素(结点),然后使头指针指向新的元素(结点)。与链表长度无关。
new_point->next = head->next;
head->next = new_point;
D
在单链表最后一个元素后插入一个新元素时,只需先将新结点指向NULL,然后将尾指针指向的原末端结点指向新的元素(结点),最后将尾指针指向新的元素(结点)。与链表长度无关。
new_point->next = NULL;
rear->next = new_point;
rear = new_point;

编辑于 2018-10-13 22:50:47 回复(5)
注意,尾指针指向的是最后一个元素的后一个位置。单链表不像双链表那样有指向前驱结点的指针,单链表只能往后指,所以就导致了,如果你想要删除最后一个结点,你不能用尾指针指向待删除结点,得用待删除结点的前一个结点的指针来实现,而要用它的前一个结点就得从头遍历一次长度为n的链表,需要操作n-1次。
发表于 2021-05-13 12:13:01 回复(0)
感觉这道题答案有问题,B和D的操作都是针对最后一个元素都需要涉及到链表长度,尾指针难道不是最后一个元素指向的节点嘛?
发表于 2018-09-01 23:10:47 回复(0)
b,因为单链表的信息包含 头指针 和 尾指针, 如果删掉最后一个节点, 为了保证 尾指针 还是指向最后一个节点, 必须去找删掉的节点的前一个节点与尾指针相连, 由于是单链表, 要找这个节点就要遍历一次链表;a,删除单链表的第一个元素,只需将头指针指向第二个节点,然后将第一个节点删除;c,在单链表第一个元素前插入一个新元素,首先,断开头指针和第一个元素使头指针指向要插入的元素,然后使要插入元素的next域指向第一个元素;d,在单链表最后一个元素前插入一个新元素,首先,断开尾指针和最后一个元素使要插入的元素的next域指向尾指针,然后将最后一个元素的节点next域指向要插入的元素。
发表于 2017-09-19 16:36:43 回复(1)
单链表,无法直接找到,尾指针前的一个所以需要,进行遍历操作,故和长度有关
发表于 2020-06-17 23:25:45 回复(0)
D答案中把原来最后一个节点的指针指向新插入的节点时,不遍历怎么找原来最后一个节点的指针?
发表于 2020-01-19 17:02:09 回复(2)
经典的错误,标准的零分
发表于 2022-11-19 22:56:31 回复(0)
D 答案应该也跟长度有关,因为是单链表肯定需要遍历到最后一个节点,让该节点的next 指向新插入的节点,它又没有办法直接取到最后一个结点需要走遍历
发表于 2022-11-06 22:04:09 回复(0)
因为尾指针没有指向它前一个元素的指针,删除最后一个元素后,它前一个元素需要置空,要遍历找到它前一个元素才可以,所以和链表长度有关
发表于 2022-09-23 11:11:44 回复(0)
我来说个人话,就是下面操作,那个是需要遍历一次数组的。

B因为是单链表,需要重新遍历去找尾
发表于 2022-09-23 09:10:30 回复(0)
删除单链表的最后一个元素需要重新指定尾指针的位置,而重新指定尾指针的过程需要从链表头遍历到链表尾,这一过程跟链表长度有关
发表于 2022-07-14 11:47:10 回复(0)
选项A如果此时只有一个结点,头指针和尾指针不都指向这个节点吗,如果将这个结点删除,最后还得将尾指针设置为NULL(如果是带有头节点的单链表则是将尾指针指向头节点),但是如果不只有一个结点,尾指针就不需要发生改变啊,所以这不应该和链表长度有关吗
发表于 2021-08-29 08:40:30 回复(1)
题目没说清楚,应该改为执行操作复杂度与链表长度(n)有关,即操作复杂度为n,对于删除链表最后一个结点操作,有尾节点的单链表删除最后一个结点还需要将倒数第二个结点指向尾结点,而倒数第二个结点的指针指向尾结点需要遍历整个单链表(O(n)--与链表长度有关)才能完成,而A,C,D操作都是O(1)
发表于 2019-01-04 21:43:44 回复(0)
二叉树不满足线性表的线性结构特点:
(1)存在唯一的一个被称作“第一个”的数据元素;
(2)存在唯一的一个被称作"最后一个"的数据元素;
(3)除第一个元素之外,集合中的每个元素均只有一个前驱;
(4)除最后一个元素之外,集合中的每个元素均只有一个后继;
发表于 2017-12-04 21:46:36 回复(0)