LeetCode — 206 Cpp y Python de lista enlazada inversa

LeetCode — 206 Cpp y Python de lista enlazada inversa

Requisito de la pregunta: Pase el puntero del encabezado de la lista vinculada e invierta la lista vinculada

El proceso es el siguiente:
Entrada: 1-> 2-> 3-> 4-> 5-> NULL
Salida: 5-> 4-> 3-> 2-> 1-> NULL

1. Métodos e ideas

Método 1: método iterativo
En el proceso de recorrer la lista vinculada, haga que el nodo actual apunte al nodo anterior. Además, se necesita otro puntero para almacenar el siguiente nodo y, finalmente, volver al nuevo nodo principal.
El proceso es el siguiente

Inserte la descripción de la imagen aquí
Al atravesar, complete tres pasos:
Paso 1: El
nodo actual apunta al nodo anterior new_head
Paso 2:
New_head se mueve a la posición de la cabeza Paso
3: La
cabeza se mueve a la siguiente posición, en este proceso, debe introducir el siguiente nodo para guardar la información de posición para completar la operación


Método 2: Recursión
La idea de la recursividad es recurrir primero al final, encontrar el último nodo y luego comenzar desde el último nodo y girar la dirección de la flecha.
Texto de marcado
Condiciones finales recursivas:

if(head == NULL || head->next == NULL) 
    return head;

Inserte la descripción de la imagen aquí

Después de obtener el último nodo, regrese a la capa superior de recursividad, p apunta al último nodo de la lista vinculada original, y ahora debería ser el nodo principal, y la p subsiguiente no necesita ser cambiada, y continúa regresando a la capa superior de recursividad.

Cambie el siguiente punto del encabezado para que apunte a sí mismo, y luego apunte el siguiente al vacío, como el último nodo de la nueva lista vinculada

head->next->next = head;
head->next = NULL;

Inserte la descripción de la imagen aquí
La recursividad termina y el retorno final es p (nodo principal)
Inserte la descripción de la imagen aquí

Dos, código C ++

#include <stdio.h>

struct ListNode {
    
    
	int val;
	ListNode *next;
	ListNode(int x) : val(x), next(NULL) {
    
    }
};

class Solution {
    
    
public:
	ListNode* ReverseTheList1(ListNode* head){
    
    //迭代法
		ListNode *new_head = NULL;
		while (head)  //进行遍历
		{
    
    
			ListNode *next = head->next;
			head->next = new_head;
			new_head = head;
			head = next;
		}
		return new_head;
	}
	ListNode* ReverseTheList2(ListNode* head) {
    
    //递归法
		if (head == NULL || head->next == NULL)
			return head;

		ListNode* p = ReverseTheList2(head->next);
		head->next->next = head;
		head->next = NULL;
		return p;
	}
	
};
	int main() {
    
    //测试用例
		ListNode a1(1);ListNode b1(2);ListNode c1(3);ListNode d1(4);ListNode e1(5);
		a1.next = &b1; b1.next = &c1; c1.next = &d1; d1.next = &e1;
		ListNode a2(1); ListNode b2(2); ListNode c2(3); ListNode d2(4); ListNode e2(5);
		a2.next = &b2; b2.next = &c2; c2.next = &d2; d2.next = &e2;
		Solution solve;
		ListNode *head1 = solve.ReverseTheList1(&a1);
		ListNode *head2 = solve.ReverseTheList2(&a2);
		while (head1){
    
    
			printf("%d\n", head1->val);
			head1 = head1->next;
		}
		printf("------------\n");
		while (head2) {
    
    
			printf("%d\n", head2->val);
			head2 = head2->next;
		}
		return 0;
	}
	//Time:O(n) Sapce:O(1)

Tres, código Python

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
	#迭代法
    def reverseList1(self, head: ListNode) -> ListNode:
        pre, cur = None, head
        while cur:
            temp = cur.next
            cur.next = pre
            pre, cur = cur, temp
        return pre

	#递归法
     def reverseList(self, head: ListNode) -> ListNode:
        if not head or not head.next:
            return head
        newhead = self.reverseList(head.next)
        head.next.next = head
        head.next = None
        return newhead

Supongo que te gusta

Origin blog.csdn.net/weixin_45680994/article/details/108531231
Recomendado
Clasificación