Estrutura de dados C/C++ --- Reversão de lista vinculada individualmente (PTA)

Pagina inicial:

Ainda há incógnitas esperando para serem exploradas_Estrutura de dados, dificuldades na linguagem C, pequenos projetos-CSDN Blog

Colunas de tópico:

Estrutura de dados_Ainda existem blogs desconhecidos esperando para serem explorados-CSDN Blog

Índice

I. Introdução

2. Título

Definição de interface de função:

Exemplo de procedimento de teste de árbitro:

Amostra de saída:

3. Compreensão + Código

1. Entenda

2.Análise 

3.Código 


I. Introdução

        Ao aprender estrutura de dados pela primeira vez, certifique-se de escrever os exemplos mais básicos e simples com muita habilidade. Cada vez que você escrevê-los, você aumentará sua compreensão de sua estrutura e estabelecerá uma base sólida para o conhecimento mais difícil no futuro. ! Você não deve copiar cegamente o código de outras pessoas. No final, você mesmo deve escrevê-lo!

2. Título

Esta questão requer a implementação de uma função para reverter uma determinada lista vinculada individualmente.

Definição de interface de função:

List Reverse( List L );

A Listestrutura é definida da seguinte forma:

typedef struct Node *PtrToNode;
struct Node {
    ElementType Data; /* 存储结点数据 */
    PtrToNode   Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */

LDada uma lista vinculada individualmente, a função Reversedeve retornar a lista vinculada invertida.

Exemplo de procedimento de teste de árbitro:

#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;
typedef struct Node *PtrToNode;
struct Node {
    ElementType Data;
    PtrToNode   Next;
};
typedef PtrToNode List;

List Read(); /* 细节在此不表 */
void Print( List L ); /* 细节在此不表 */

List Reverse( List L );

int main()
{
    List L1, L2;
    L1 = Read();
    L2 = Reverse(L1);
    Print(L1);
    Print(L2);
    return 0;
}

/* 你的代码将被嵌在这里 */

5
1 3 4 5 2

Amostra de saída:

1
2 5 4 3 1

Limite de comprimento de código

16KB

limite de tempo

400ms

limite de memória

64MB

3. Compreensão + Código

1. Entenda

Ao ver esta pergunta, você pode de repente se sentir muito familiarizado, como se fosse muito semelhante à inversão de cordas que você aprendeu antes.

Existem muitas ideias para reversão de strings :

1. Não recursivo: basta usar duas variáveis, uma variável à esquerda aponta para o primeiro caractere da string e a outra variável à direita aponta para o último caractere da string e, em seguida, troque-as para determinar o sinal final. (O código chave é o seguinte)

while(left<right)
{
    //交换
}

2. Recursão, realizando ordem inversa de acordo com as características da recursão

#include<stdio.h>
int my_strlen(char* arr)
{
	if (*arr != '\0')
		return 1 + my_strlen(arr + 1);
	else
		return 0;
}
char* rev(char* arr)
{
	char tmp = *arr;
	int len = my_strlen(arr);
	*arr = *(arr + len - 1);
	*(arr + len - 1) = '\0';
	if (my_strlen(arr+1) >=2)
		rev(arr + 1);
	*(arr + len - 1) = tmp;
}
int main()
{
	char arr[] = "abcdef";
	rev(arr);
	printf("%s", arr);
	return 0;
}

Pergunta: Falando nisso, a ordem inversa de uma lista encadeada simples também pode ser usada dessa forma?

Resposta: 1. Se você usar a primeira ideia, como mover o ponteiro para o último nó para frente?Isso requer um loop para encontrar o endereço do nó anterior que deseja apenas o último nó, o que é mais problemático. 2. Se você usar a segunda ideia, basta escrevê-la no papel. Sinto que pode ser usada. Aqui está uma pequena pergunta para todos pensarem (imite-a com base no método de escrita recursiva acima e veja se pode ser usada ) realizar).

2.Análise 

Além das ideias usadas na reversão de strings, existe alguma maneira de completar a reversão desta lista vinculada individualmente com base nas características da lista vinculada?

Ao criar uma lista vinculada, introduzi dois métodos, um é o método de inserção de cabeça e o outro é o método de inserção de cauda. Quais são as características desses dois métodos? Você ainda se lembra? (O link que não me lembro é o seguinte:) Estrutura de dados --- tabela de sequência --- estrutura de armazenamento em cadeia 1 (sem nó líder)_Ainda há blogs desconhecidos esperando para serem explorados-blog CSDN 

A característica mais essencial da interpolação principal e da interpolação final é a ordem de armazenamento dos dados e a ordem dos dados de entrada após a criação. O método de interpolação principal é que a ordem de armazenamento é oposta à ordem dos dados de entrada, e o método de interpolação final é que a ordem de armazenamento é igual à ordem dos dados de entrada.

Portanto, de acordo com a ideia de interpolação principal, podemos ler os dados da lista vinculada individualmente, um por um, em ordem, e então usar o método de interpolação principal para criar uma nova lista vinculada para armazenamento? A resposta é sim. Além disso, este método é mais simples que a ideia anterior e incorpora melhor algumas características da lista encadeada.

  //O método de inserção do cabeçote não exige julgar se o cabeçote está vazio, o que também foi explicado no artigo anterior.

3.Código 

List Reverse( List L )
{
    List p=L,head=NULL,q;//创建一个头指针
    //头插法不需要对head是否为空进行判断,再之前的文章中也讲解过
    while(p!=NULL)
    {
        q=(List)malloc(sizeof(struct Node));
        q->Next=NULL;
        q->Data=p->Data;
        q->Next=head;
        head=q;
        p=p->Next;
    }
    if(L!=NULL)
        L->Next=NULL;
    return head;
}

 Obrigado por seu apoio!

Acho que você gosta

Origin blog.csdn.net/qq_73435980/article/details/133345851
Recomendado
Clasificación