共42道题,当前是第16

初赛真题

(链表反转)单向链表反转是⼀道经典算法问题,⽐如有⼀个链表是这样的 $1 -> 2 -> 3 -> 4 -> 5$,反转后成为 $5 -> 4 -> 3 -> 2 -> 1$ 。现给定如下链表节点的定义:

struct linkNode {
	int value;
	linkNode* next;
};
⾮递归实现:

linkNode* Reverse(linkNode* header) {
	if (header == NULL || header->next == NULL) {
		return header;
	}
	linkNode *pre = header, *cur = header->next;
	pre->next = NULL;
	while (cur != NULL) {
		linkNode* next = ___(1)___;
		___(2)___ = pre;
		pre = cur;
		cur = next;
	}
	return pre;
}
递归实现:

linkNode* Reverse(linkNode* head) {
	if (head == NULL || head->next == NULL) {
		return head;
	}
	linkNode* newhead = ___(3)___;
	___(4)___ = head;
	head->next = ___(5)___;
	return newhead;
}

1. B。
2. B。
3. D。
4. C。
5. D。

通过两段代码不同的⽅式实现了列表的翻转,核⼼思想就是每次处理列表中两个相邻的节点,通过交换指针的⽅式来重新组织其顺序。第⼀段代码就是通过迭代的⽅式来进⾏访问的,记录下来相邻的节点,并交换其指针。第⼆段代码是通过递归的⽅式来访问的,函数返回值是翻转后的链表头指针,每层递归都是翻转两个相邻的节点。

Question

1. (1) 中应填

2. (2) 中应填

3. (3) 中应填

4. (4) 中应填

5. (5) 中应填

陈伦制作 版权所无 粤ICP备16127491号-1