Pregunta 22 de la oferta de Sword Finger: el nodo K de la parte inferior de la lista vinculada

Pregunta 22 de la oferta de Sword Finger: el nodo K de la parte inferior de la lista vinculada

tema

Ingrese una lista vinculada y genere el nodo Kth desde la parte inferior de la lista vinculada. Para ajustarse a los hábitos de la mayoría de las personas, comience a contar desde la primera de esta pregunta, es decir, el nodo final de la lista vinculada es el primer nodo desde la parte inferior. Por ejemplo, una lista vinculada tiene 6 nodos. A partir del nodo principal, sus valores son 1, 2, 3, 4, 5, 6. El tercer nodo de la parte inferior de la lista vinculada es el nodo con el valor 4 . El nodo se define de la siguiente manera:

struct ListNode
{
    
    
	int m_nValue;
	ListNode* m_pNext;
}

Pensando

Para obtener el k-ésimo nodo desde abajo, la idea más natural es, por supuesto, ir primero al final y luego retroceder K pasos. Pero como puede ver en la definición, esta es una lista enlazada individualmente. Entonces esto no funcionará.

método uno

Entonces todavía tenemos que volver al nodo principal. Toda la lista enlazada tiene n nodos, y el Kth de la parte inferior es n-k + 1 nodos. La clave es obtener n, y si tiene n, simplemente retroceda n-k + 1 pasos desde el principio. ¿Cómo obtener n? Repítalo una vez y podrás obtener el recuento.
Este método debe recorrer ambos lados de la lista enlazada, la primera vez que se cuenta el número de nodos y la segunda vez para encontrar el nodo K desde la parte inferior.
Entonces, ¿hay alguna forma de iterar solo una vez? Por supuesto que hay

Método dos

Para darse cuenta de que se puede completar un recorrido, es necesario definir dos punteros.
El primer puntero comienza a atravesar desde el puntero principal de la lista vinculada y avanza pasos K-1; el segundo puntero permanece inmóvil, comenzando desde el paso K, el segundo puntero también comienza a atravesar desde el puntero principal de la lista vinculada.
Mantenga la distancia entre los dos punteros k-1. Cuando el puntero delantero llega al nodo de cola, el puntero de atrás realmente apunta al nodo Kth desde la parte inferior.

ejemplo

Aquí hay un ejemplo. Hay 6 nodos en total. Busque el tercer nodo desde la parte inferior. El
diagrama es el siguiente:
Inserte la descripción de la imagen aquí

Código

Antes de escribir el código, también necesitamos eliminar algunos casos especiales:
1. La entrada pListHead es un puntero nulo. Si accede directamente al contenido señalado por el puntero nulo, el programa se bloqueará
2. El número total de nodos en la lista vinculada de entrada con pListHead como nodo principal es menor que k. Dado que la recirculación avanzará k pasos en la lista vinculada, aún fallará debido al problema del puntero nulo.
3. El parámetro de entrada es 0. Dado que k es un entero sin signo, k-1 no es -1 en el loop., Pero 4294967295 (0xFFFFFFFF), por lo que el número de ejecuciones del ciclo for supera con creces nuestras expectativas, lo que también provocará un bloqueo

ListNode* FindKthToTail(ListNode* pListHead,unsigned int k)
{
    
    
	if(pListHead==nullptr || k==0)
		return nullptr;
	ListNode* pAhead=pListHead;
	ListNode* pBehind=nullptr;

	for(unsigned int i=0;i<k-1;++i)
	{
    
    
		if(pAhead->mpNext!=nullptr)
			pAhead=pAhead->m_pNext;
		else
			return nullptr;
	}
	pBehind=pListHead;
	while(pAhead->m_pNext!=nullptr)
	{
    
    
		pAhead=pAhead->m_pNext;
		pBehind=pBehind->m_pNext;
	}
	return pBehind;
}

Supongo que te gusta

Origin blog.csdn.net/rjszz1314/article/details/104334787
Recomendado
Clasificación