Fortuna abandonó Francia título 7 bases class3- revertir la lista unidireccional y bidireccional vinculados

Problema 1: Reverse lista enlazada

[Obligatorio] Si la longitud de cadena es N, los requisitos de tiempo de complejidad de O (N), el espacio adicional
requisitos de complejidad de O (1)

1. Analizar

Inversion puede usarse lista método iterativo de enlace simple, requiere tres punteros, respectivamente un frente de registros de nodo, el nodo actual y un nodo. Al invertir el punto de nodo actual antes de un nodo, el nodo actual y el nodo anterior hacia atrás, para continuar hasta el final de reversión. Porque después se desconectará reversión después del punto de nodo actual para cambiar el nodo, por lo que es necesario llevar a cabo un puntero a un nodo del nodo actual. El estado general de la iteración es el nodo actual no está vacío.

2. El código de núcleo

(1) producir una lista completa
① como estructuras de datos, campo de datos val, * siguiente punto al siguiente nodo, ya que el nodo señaló, a fin de definir un NodoLista tipo de puntero.

typedef struct ListNode
{
	int val;
	ListNode *next;
}*List;

Tail utilizando interpolación ②: El nuevo nodo se inserta en el extremo

malloc es responsable de la apertura de un espacio para el tamaño del espacio de almacenamiento está sizeof(ListNode)a punto de volver a la malloc defecto * vacío, necesidad de fundición a la lista de estructura de tipo puntero. L es un nodo principal para el almacenamiento de datos no sólo para almacenar la dirección de la cabeza de la lista, que apunta al nodo de la cola temporalmente nodo principal. P nodo almacena abierto de datos, el nodo de cola a la nueva lista de configuración de nodo y, a continuación el nuevo nodo como el nodo de cola, y luego continuar para desarrollar nuevo nodo de almacenamiento. Finalmente, el nodo de cola en NULL.

	ListNode* L = (List)malloc(sizeof(ListNode));
	//List L = (List)malloc(sizeof(ListNode));与上式等价
	L->next = NULL;

	//使用尾插法
	List p,r;//p是新结点,r是尾节点
	r = L;	//把尾节点指向头节点
	for(int i = 0;i < N;i++)
	{
		p = (List)malloc(sizeof(ListNode));
		p->val = i * 5;
		r->next = p;
		r = p;
	}
	r->next = NULL;

(2) de simple inversión de la cadena

List reverseList(List head) 
{
	List pre = NULL;
	List cur = head->next;//需要反转的当前节点从头节点的下一个开始
	while(cur != NULL)
	{
		List temp = cur->next;
		cur->next = pre;
		pre = cur;
		cur = temp;
	}
	
	return pre;
}

3. El código completo

#include<iostream>
#include<stdlib.h>
//#include<time.h>
#define N 5
typedef struct ListNode
{
	int val;
	ListNode *next;
}*List;



List reverseList(List head) 
{
	List pre = NULL;
	List cur = head->next;
	while(cur != NULL)
	{
		List temp = cur->next;
		
		cur->next = pre;
		pre = cur;
		cur = temp;
	}
	
	return pre;
}

int main()
{
	//srand(time(0));
	ListNode* L = (List)malloc(sizeof(ListNode));
	//List L = (List)malloc(sizeof(ListNode));与上式等价
	L->next = NULL;

	//使用尾插法
	List p,r;//p是新结点,r是尾节点
	r = L;	//把尾节点指向头节点
	for(int i = 0;i < N;i++)
	{
		p = (List)malloc(sizeof(ListNode));
		//p->val = rand() % 15;
		p->val = i * 5;
		r->next = p;
		r = p;
	}
	r->next = NULL;

	List newhead = NULL;
	newhead = reverseList(L) ;

	system("pause");
	return 0;
}

4. La salida

L es la forma original de lista enlazada, y val es el primer nodo de cabecera;
Aquí Insertar imagen Descripción
lista enlazada manera después de la inversión.
Aquí Insertar imagen Descripción

Tema 2: Reverse lista doblemente enlazada

Invertir la de una vía y de dos vías lista enlazada
[title], respectivamente, para conseguir una función de lista enlazada reversión de una sola vía y revertir lista doblemente enlazada.
[Obligatorio] Si la longitud de cadena es N, los requisitos de tiempo de complejidad de O (N), el espacio adicional
requisitos de complejidad de O (1)

1. Analizar

lista doblemente enlazada sólo tiene que invertir puntero pre y el siguiente puntero del nodo actual para el intercambio, una operación separada para cada nodo, y no otros nodos.

2. El código de núcleo

La creación de (1) una lista doblemente enlazada
de la estructura de datos de la lista doblemente enlazada de datos consiste en un campo de puntero de dos campos;


typedef struct doublelist
{
	int val;
	doublelist* next;
	doublelist* pre;

}*List;

Doblemente enlazada interpolación lista cola y sustancialmente de la misma manera excepto que la etapa de registrar el aumento de puntero pre;

	List p,r,head = NULL;
	r = NULL;
	for(int i = 0;i < 4;i++)
	{
		p = (List)malloc(sizeof(doublelist));
		p->val = 5 * i;
		p->pre = r;
		if(r == NULL)
		{
			r = p;
			head = p;
			continue;
		}
		r->next = p;
		r = p;
	}
	r->next =NULL;

(2) Reverso lista doblemente enlazada
usando la variable temporal intermedio siguiente puntero, y luego de cambio preestablecido siguiente puntero, el último puntero al nodo anterior se le asigna al nodo actual, continuó inversa. Tenga en cuenta que, el siguiente puntero como puntero ya pre intercambia, por lo que el primer puntero a un nodo en realidad es el siguiente nodo.

List reverseList(List head) 
{
	List p = head;
	List temp = NULL;
	while(p!=NULL)
	{
		temp = p->next;
		p->next = p->pre;
		p->pre = temp;
		p = p->pre;
	}
	
	return head;
}

3. El código completo

#include<iostream>

typedef struct doublelist
{
	int val;
	doublelist* next;
	doublelist* pre;

}*List;

List reverseList(List head) 
{
	List p = head;
	List temp = NULL;
	while(p!=NULL)
	{
		temp = p->next;
		p->next = p->pre;
		p->pre = temp;
		p = p->pre;
	}
	return head;
}

int main()
{
	List p,r,head = NULL;
	r = NULL;
	for(int i = 0;i < 4;i++)
	{
		p = (List)malloc(sizeof(doublelist));
		p->val = 5 * i;
		p->pre = r;
		if(r == NULL)
		{
			r = p;
			head = p;
			continue;
		}
		r->next = p;
		r = p;
	}
	r->next =NULL;
	
	List newhead = NULL;
	newhead = reverseList(head) ;

	return 0;
}

4. La salida

Cuando se crea una lista enlazada seguido de la siguiente dirección 0,5,10,15, y la dirección de pre está vacía;
Aquí Insertar imagen Descripción
después de invertir la dirección siguiente lista está vacía, mientras que la dirección pre 0,5,10,15, se puede ver la lista doblemente enlazada ya revertir.
Aquí Insertar imagen Descripción

Publicado 51 artículos originales · ganado elogios 1 · vistas 1383

Supongo que te gusta

Origin blog.csdn.net/shi_xiao_xuan/article/details/103700827
Recomendado
Clasificación