Рубрики
Без рубрики

Как изменить связанный список? (Реализация C и Python)

Как изменить связанный список с использованием итеративного и рекурсивного подхода. C и реализация кода C и Python Чтобы изменить связанный список, обратный обратный код связанного списка

Автор оригинала: Pankaj Kumar.

Связанный список – это простой, но увлекательная структура данных, которую можно использовать для хранения линейно связанных нереационных данных.

Мы часто встречаются с интересными манипулятивными проблемами, используя связанный список по мере того, как они требуют нерешенного мышления с ограниченными свойствами по отдельно связанным списком.

В этой статье мы будем обсуждать проблему на Обратитесь в одиночку связанный список Отказ

На протяжении всей статьи я предполагаю, что вы сможете понять базовую терминологию, связанную с связанными списками. Если это не так, пожалуйста, обратитесь к следующей статье (S) перед чтением.

Java linkedList – LinkedList в Java

Реверсив связанный список

Давайте погрузиться прямо в обсуждение для решения. Мы обсудим два метода:

  • Итеративный раствор (используя 3 указателя)
  • Рекурсивное решение (используя указатели псевдо-2)

Примечание : Я бы предложил вам попытаться решить проблему, а затем перейти к решению.

Обратный список связан с использованием итеративного решения

  • Давайте сначала перейдем к базовым случаям. Если связанный список имеет 0 или только 1 узел, то он не имеет смысла поменять список, поэтому мы можем просто вернуть тогда и там.
  • Предполагая, что у нас сейчас узлы, мы можем сделать следующее.
  • Держите 3 указателя на предыдущем узле, текущем узле, следующем узле.
  • Изначально назначить предыдущий узел как NULL, текущий узел в качестве головы и следующего узла в качестве преемника головы.
  • Обратитесь в связь между предыдущим и текущим узлом.
  • Переместите все указатели на шаг вперед, сделав следующие:
    1. Предыдущий узел
    2. Текущий узел
    3. Следующий узел -> следующий
  • Перейдите к шагу 5, пока текущий узел не станет NULL.
  • Назначьте голову как предыдущий узел и возврат.

Код, следующий на этой парадигме, можно найти здесь.

Код в C.

#include
#include

struct node{
int data;
struct node *next;
} *head = NULL;

struct node *make_node(int data){
struct node *new = (struct node *)malloc(sizeof(struct node));
new->next = NULL; new->data = data;
return new;
}

void push(int data){
struct node *new_node = make_node(data);
new_node->next = head;
head = new_node;
}

void print_list(){
struct node *cur = head;
while(cur){
printf("%d ", cur->data);
cur = cur->next;
}
printf("\n");
}

void reverse_list(){
if(head == NULL || head->next == NULL)
return;
struct node *prev = NULL, *cur = head, *next;
while(cur){
next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
head = prev;
}

int main(){

push(3);
push(4);
push(5);
push(6);


printf("Given Linked list is: ");
print_list();

reverse_list();

printf("Reversed Linked list is: ");
print_list();

return 0;
}

Код в Python

class Node:

    def __init__(self, data):
        self.data = data
        self.next = None


class LinkedList:

    def __init__(self):
        self.head = None

    def reverse(self):
        if self.head is None or self.head.next is None:
            return

        prev = None
        cur = self.head

        while cur:
            next_element = cur.next
            cur.next = prev
            prev = cur
            cur = next_element

        self.head = prev

    def push(self, data):
        new_node = Node(data)
        new_node.next = self.head
        self.head = new_node

    def print_list(self):
        cur = self.head
        l1 = []
        while cur:
            l1.append(cur.data)
            cur = cur.next
        return l1


head = LinkedList()
head.push(3)
head.push(4)
head.push(5)
head.push(6)
print("Given list is: ", head.print_list())
head.reverse()
print("Reversed list is: ", head.print_list())

Обратный список связан с использованием рекурсивного решения

Рекурсивное решение немного легко понять, поскольку он использует более естественный и простой для понимания алгоритма. Тем не менее, итеративные и рекурсивные решения аналогичны в работе.

В основном мы используем рекурсию, чтобы заменить указатель «Далее», поскольку мы можем вернуться вперед до конца связанного списка и следуйте аналогичным образом как итеративное решение.

Единственные различия, которые мы перемещаем назад, а также до конца списка, из-за использования рекурсии.

Также обратите внимание, что в рекурсивом решении нам не требуется следующий указатель, поскольку рекурсия позволяет нам двигаться вперед в связанном списке.

Здесь мы определяем рекурсивное решение в 2 частях:

  • Рекурсивный случай:
    1. Мы сначала продвинулись вперед в связанном списке.
    2. Когда рекурсион заканчивается, мы можем просто связать текущий узел к предыдущему узлу.
  • Базовый чехол: если текущий элемент NULL, то мы можем просто назначить голову как предыдущий узел I.E. Последний узел связанного списка в этом случае.

Код, следующий за этой парадигмой, можно найти здесь:

Код в C.

#include
#include

struct node{
int data;
struct node *next;
} *head = NULL;

struct node *make_node(int data){
struct node *new = (struct node *)malloc(sizeof(struct node));
new->next = NULL; new->data = data;
return new;
}

void push(int data){
struct node *new_node = make_node(data);
new_node->next = head;
head = new_node;
}

void print_list(){
struct node *cur = head;
while(cur){
printf("%d ", cur->data);
cur = cur->next;
}
printf("\n");
}

struct node *reverse_list(struct node *prev, struct node *cur){
if(cur == NULL){
head = prev;
}
else{
reverse_list(cur, cur->next);
cur->next = prev;
}
}

int main(){

push(3);
push(4);
push(5);
push(6);

printf("Given Linked list is: ");
print_list();

reverse_list(NULL, head);

printf("Reversed Linked list is: ");
print_list();

return 0;
}

Код в Python

class Node:

    def __init__(self, data):
        self.data = data
        self.next = None


class LinkedList:

    def __init__(self):

        self.head = None

    def _reverse(self, prev, cur):

        if cur is None:
            self.head = prev

        else:
            self._reverse(cur, cur.next)
            cur.next = prev

    def reverse(self):

        self._reverse(None, self.head)

    def push(self, data):

        new_node = Node(data)
        new_node.next = self.head
        self.head = new_node

    def print_list(self):

        cur = self.head
        l1 = []
        while cur:
            l1.append(cur.data)
            cur = cur.next
        return l1


head = LinkedList()
head.push(3)
head.push(4)
head.push(5)
head.push(6)
print("Given list is: ", head.print_list())
head.reverse()
print("Reversed list is: ", head.print_list())

Выход

Обратный список связан с использованием рекурсии – Python