Skip to content

Latest commit

 

History

History
176 lines (134 loc) · 8.13 KB

reversal.md

File metadata and controls

176 lines (134 loc) · 8.13 KB

Q:

Hãy giải thích từng bước (step-by-step) hàm REVERSAL sau lên một circular linked list. Mỗi node của linked list sẽ mang giá trị ENERGY âm hoặc dương. Khách hàng là oán linh có ENERGY âm (<0). Khách hàng là chú thuật sư có ENERGY dương (>0). REVERSAL: Từ vị trí X và xét theo chiều ngược chiều kim đồng hồ, tiến hành đảo ngược vị trí của khách hàng trong nhà hàng. Tuy nhiên, nhân viên chỉ có thể đảo ngược vị trí của những khách hàng cùng là oán linh hoặc cùng là chú thuật sư và không thể hoán đổi vị trí của oán linh và chú thuật sư cho nhau. Ví dụ đối với vị trí của các khách hàng được mô tả ở hình bên trái. Giả sử vị trí X là vị trí có ENERGY = -12, sau khi thực hiện lệnh REVERSAL sẽ được kết quả như hình bên phải: Trước: (-55->) -12-> 14-> -25-> -33-> 47-> -55(-> -12) Sau: (-33->) -25-> 47-> -12-> -55-> 14-> -33(-> -25)

A:

Hàm REVERSAL hoạt động như sau:

  1. Bắt đầu từ vị trí X : Đầu tiên, chúng ta bắt đầu từ vị trí X trên danh sách liên kết hình tròn. Trong ví dụ của bạn, X là nút có ENERGY = -12.
  2. Xác định hướng đi : Chúng ta sẽ tiến hành theo chiều ngược chiều kim đồng hồ từ vị trí X.
  3. Tìm kiếm các nút cùng loại : Chúng ta sẽ tìm kiếm các nút liền kề mà có cùng loại ENERGY (âm hoặc dương) với nút X. Trong ví dụ của bạn, chúng ta sẽ tìm các nút có ENERGY âm vì X có ENERGY âm.
  4. Đảo ngược vị trí : Khi chúng ta đã xác định được các nút cùng loại, chúng ta sẽ đảo ngược vị trí của chúng. Điều này có nghĩa là nút đầu tiên trong chuỗi sẽ trở thành nút cuối cùng, nút thứ hai sẽ trở thành nút gần cuối, và cứ như vậy.
  5. Kết thúc khi gặp loại khác : Quá trình này sẽ tiếp tục cho đến khi chúng ta gặp một nút có loại ENERGY khác với X (trong trường hợp này là một nút có ENERGY dương). Khi đó, quá trình đảo ngược sẽ dừng lại.

Vậy là chúng ta đã hoàn thành việc thực hiện hàm REVERSAL! Hy vọng rằng giải thích của tôi đã giúp bạn hiểu rõ hơn về cách hoạt động của hàm này.

Q:

Circular linked list này sử dụng doubly linked list. Có một node là recent. Sử dụng cấu trúc trên và đưa ra giải thuật phù hợp cho REVERSAL

A:

Dưới đây là giải thuật cho hàm REVERSAL trên một circular doubly linked list:

  1. Khởi tạo : Đầu tiên, chúng ta cần một biến recent để lưu trữ nút gần nhất được truy cập. Chúng ta cũng cần hai con trỏ startend để lưu trữ phạm vi các nút cùng loại (cùng ENERGY âm hoặc dương) mà chúng ta muốn đảo ngược.
  2. Xác định phạm vi đảo ngược : Bắt đầu từ nút recent, chúng ta di chuyển theo chiều ngược chiều kim đồng hồ và xác định phạm vi các nút cùng loại. start sẽ trỏ đến nút đầu tiên trong chuỗi và end sẽ trỏ đến nút cuối cùng.
  3. Đảo ngược phạm vi : Bây giờ, chúng ta sẽ đảo ngược phạm vi từ start đến end. Điều này có thể được thực hiện bằng cách sử dụng hai con trỏ để di chuyển từ hai đầu của phạm vi về phía giữa, và hoán đổi liên kết của mỗi cặp nút tương ứng.
  4. Cập nhật liên kết : Sau khi đã đảo ngược phạm vi, chúng ta cần cập nhật liên kết của các nút ở hai đầu phạm vi với các nút liền kề bên ngoài phạm vi. Điều này đảm bảo rằng danh sách vẫn liên kết một cách hợp lệ sau khi thực hiện REVERSAL.
  5. Cập nhật recent : Cuối cùng, chúng ta cập nhật recent để trỏ đến nút mà recent đã trỏ đến trước khi thực hiện REVERSAL. Điều này cho phép chúng ta tiếp tục thao tác với danh sách sau khi đã thực hiện REVERSAL.

Hy vọng rằng giải thuật này sẽ giúp bạn hiểu rõ hơn về cách thực hiện hàm REVERSAL trên một circular doubly linked list! Nếu bạn có bất kỳ câu hỏi hoặc thắc mắc gì, hãy để lại cho tôi biết! 😊

Q:

Thực hiện giải thuật trên python

A:

Dưới đây là một cách thực hiện giải thuật REVERSAL trên Python:

class Node:
    def __init__(self, energy):
        self.energy = energy
        self.next = None
        self.prev = None

class CircularDoublyLinkedList:
    def __init__(self):
        self.recent = None

    def append(self, energy):
        if not self.recent:
            self.recent = Node(energy)
            self.recent.next = self.recent
            self.recent.prev = self.recent
        else:
            new_node = Node(energy)
            new_node.prev = self.recent
            new_node.next = self.recent.next
            self.recent.next.prev = new_node
            self.recent.next = new_node
            self.recent = new_node

    def reversal(self):
        if not self.recent:
            return

        start = end = self.recent

        while True:
            if start.energy * start.prev.energy > 0:
                start = start.prev
            else:
                break

        while True:
            if end.energy * end.next.energy > 0:
                end = end.next
            else:
                break

        while start != end:
            start.energy, end.energy = end.energy, start.energy
            if start.next == end or start == end.prev:
                break
            start = start.next
            end = end.prev

    def display(self):
        temp = self.recent.next
        while True:
            print(temp.energy, end=' ')
            temp = temp.next
            if temp == self.recent.next:
                break

Bạn có thể sử dụng hàm append để thêm các nút vào danh sách liên kết và hàm reversal để thực hiện REVERSAL. Hàm display sẽ in ra các giá trị ENERGY của tất cả các nút trong danh sách liên kết. Chúc bạn thành công! 😊

Q:

Viết bằng C++

A:

Dưới đây là một cách thực hiện giải thuật REVERSAL trên C++:

#include <iostream>
using namespace std;

struct Node {
    int energy;
    Node* next;
    Node* prev;
};

class CircularDoublyLinkedList {
public:
    Node* recent;

    CircularDoublyLinkedList() {
        recent = NULL;
    }

    void append(int energy) {
        Node* newNode = new Node();
        newNode->energy = energy;

        if (recent == NULL) {
            recent = newNode;
            recent->next = recent;
            recent->prev = recent;
        } else {
            newNode->prev = recent;
            newNode->next = recent->next;
            recent->next->prev = newNode;
            recent->next = newNode;
            recent = newNode;
        }
    }

    void reversal() {
        if (recent == NULL) return;

        Node* start = recent;
        Node* end = recent;

        while (start->energy * start->prev->energy > 0)
            start = start->prev;

        while (end->energy * end->next->energy > 0)
            end = end->next;

        while (start != end) {
            swap(start->energy, end->energy);
            if (start->next == end || start == end->prev)
                break;
            start = start->next;
            end = end->prev;
        }
    }

    void display() {
        Node* temp = recent->next;
        do {
            cout << temp->energy << " ";
            temp = temp->next;
        } while (temp != recent->next);
        cout << endl;
    }
};

Bạn có thể sử dụng hàm append để thêm các nút vào danh sách liên kết và hàm reversal để thực hiện REVERSAL. Hàm display sẽ in ra các giá trị ENERGY của tất cả các nút trong danh sách liên kết. Chúc bạn thành công! 😊