Interpolación rápida y lenta de puntero y cabeza e interpolación de cola (basada en lenguaje C)

 El efecto mágico de los punteros rápidos y lentos

1. Encuentra el valor medio

La idea general es: primero recorra la lista vinculada una vez, registre cuántos nodos hay en total y luego recorra nuevamente para encontrar el punto medio.

Usando punteros rápidos y lentos, veamos en qué se convertirá este problema. La idea es la siguiente: consideramos una lista enlazada como una pista, asumiendo que la velocidad de a es el doble que la de b, entonces cuando a ha terminado el recorrido, b correrá a la mitad para lograr el propósito de encontrar el nodo intermedio.

2. Determine el anillo en la lista vinculada

Aún compare la lista vinculada con una pista, hay bucles en la lista vinculada, entonces esta pista es una pista circular, en una pista circular, si dos personas tienen una diferencia de velocidad, entonces dos personas se encontrarán tarde o temprano, siempre que se encuentran, entonces hay un bucle.

3. Elimina el n-ésimo nodo de la parte inferior.

Eliminar el n-ésimo nodo de la parte inferior equivale a encontrar el elemento antes del elemento a eliminar, que es el n-1 ° nodo. Inteligente, debes haberlo encontrado Hemos convertido este problema en un problema de encontrar un determinado nodo en la lista enlazada.

#include<string>
#include<iostream>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
typedef struct student
{
	int num;
	struct student *pnext;
}STU;
STU* Greatlist1()
{
	STU *pstu1 = (STU*)malloc(sizeof(STU));
	pstu1->pnext = NULL;
	return pstu1;
}
STU* GreastList2()
{
	STU *pstu2 = (STU*)malloc(sizeof(STU));
	pstu2->pnext = NULL;
	return pstu2;
}
void AddNode1(STU*p)//尾插法
{
	int num_1;
	cout << "输入尾插法要添加的节点数" << endl;
	cin >> num_1;
	STU*pnew = NULL;
	for (int i = 0,j=0; i < num_1; i++,j++)
	{
		pnew = (STU*)malloc(sizeof(STU));
		pnew->num = j;
		pnew->pnext = NULL;
		p->pnext = pnew;
		p = p->pnext;
	}
}
void AddNode2(STU*p)//头插法
{
	int num1;
	cout << "输入头插法要添加的节点数" << endl;
	cin >> num1;
	STU*pnew1 = NULL;
	for (int i = 0, j = 0; i < num1; i++, j++)
	{
		pnew1 = (STU*)malloc(sizeof(STU));
		pnew1->num = j;
		pnew1->pnext = p->pnext;
		p->pnext = pnew1;
	}
}
void Print1(STU*p)
{
	while (p->pnext != NULL)
	{
		cout << p->pnext->num<<"   ";
		p = p->pnext;
	}
	cout << endl;
}
void Print2(STU*p)
{
	while (p->pnext != NULL)
	{
		cout << p->pnext->num<<"  ";
		p = p->pnext;
	}
	cout << endl;
}
//快慢指针
void SearchAddNode1(STU*p)
{
	STU*fast = p;
	STU*slow = p;
	int count = 0, ss = 0;
	while (fast )
	{
		if (fast->pnext == NULL)
		{
			ss = 1;//1为偶数
			break;
		}
		count++;
		fast = fast->pnext->pnext;
		slow = slow->pnext;
	}
	if (count==0)
		cout << "List1没有元素" << endl;
	else
	{
		if (ss == 0)
		{
			cout << "平均值在当前位数为:" << count << "   " << "List1中点元素平均值为: " << slow->num << endl;
		}
		else
		{
			cout << "平均值在当前位数为:" << count<<"和"<< count+1 <<"之间"<< "  ";
			cout << "List1中点元素平均值为: " << (float)(slow->num + slow->pnext->num) / 2 << endl;
		}
	}
}
void SearchAddNode2(STU*p)
{
	STU*fast = p;
	STU*slow = p;
	int count = 0, ss = 0;
	while (fast)
	{
		if (fast->pnext == NULL)
		{
			ss = 1;//1为偶数
			break;
		}
		count++;
		fast = fast->pnext->pnext;
		slow = slow->pnext;
	}
	if (count == 0)
		cout << "List2没有元素" << endl;
	else
	{
		if (ss == 0)
		{
			cout << "平均值在当前位数为:" << count << "   " << "List2中点元素平均值为: " << slow->num << endl;
		}
		else
		{
			cout << "平均值在当前位数为:" << count<<"和"<< count-1 <<"之间" << "  ";
			cout << "List2中点元素平均值为: " << (float)(slow->num + slow->pnext->num) / 2 << endl;
		}
	}
}
int main()
{
	STU*p1 = Greatlist1();
	AddNode1(p1);
	Print1(p1);
	SearchAddNode1(p1);
	STU*p2 = GreastList2();
	AddNode2(p2);
	Print2(p2);
	SearchAddNode2(p2);
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/m0_49019274/article/details/115037506
Recomendado
Clasificación