链表不像顺序表查找来的方便,因为链表是没有索引的。(我们使用带有头节点的链表进行讨论

方法一:

  1. 我们可以先获取链表的长度

  2. 再找出顺须节点的位置

  3. 重新遍历统计位置匹配

缺点:查找效率低 推荐

方法二:

  1. 使用俩个指针,一个快指针,一个慢指针

  2. 快的先走N步,然后快慢指针同步进行

  3. 快指针指向地址为NULL的时候就表示已经到达最后一个位置

  4. 这时候慢指针距离最后一个位置就相差N个单位

  • 优点:查找效率高 推荐

下面是使用C语言代码实现示例

//使用快慢指针
int findNode(Node*list, int pos) {
	Node *fast = list->next;//指向第一个节点
	Node *slow = list->next;
	//想让快指针走pos步
	for (int i = 0; i < pos; ++i)
	{
		/* code */
		fast = fast->next;
		if (fast == NULL) {
			return 0;//表示链表长度不够
		}
	}
	//判断fast指针有没有移动到空位置
	while (fast != NULL) {
		//快慢指针同步走
		fast = fast->next;
		slow = slow->next;
	}
	//循环结束表示快指针已经指向空地址 也就是最后一个节点 慢指针也就已就为倒数第pos个位置了
	printf("倒数第%d个位置元素为%d", pos, slow->data);
	return 1;
}

实现思路:

  • 首先让快指针走N步,如果在期间快指针已经指向NULL了表示链表长度不足以找到倒数第N个位置

  • 快指针不为NULL,表示链表长度合理,可以找到倒数N个位置

  • 同步走,此时表示快慢指针已经间隔N个位置

  • 当快指针指向NULL时,也就是最后一个位置,那么慢指针就已经为倒数第N个位置

文章作者: Administrator
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 叶秋の小窝
Code c
喜欢就支持一下吧