11.21

为啥不懂就问發表於2024-11-21

include

include

using namespace std;

// 雙向連結串列結點結構體
struct Node {
int data;
Node* prior;
Node* next;
Node(int val) : data(val), prior(nullptr), next(nullptr) {}
};

// 雙向迴圈連結串列類
class CircularDoublyLinkedList {
public:
Node* head;

CircularDoublyLinkedList() : head(nullptr) {}

// 構建雙向迴圈連結串列
void createList(const vector<int>& elements) {
    if (elements.empty()) return;
    head = new Node(elements[0]);
    Node* current = head;
    for (int i = 1; i < elements.size(); ++i) {
        Node* newNode = new Node(elements[i]);
        current->next = newNode;
        newNode->prior = current;
        current = newNode;
    }
    current->next = head;  // 形成迴圈
    head->prior = current;
}

// 查詢指定值的結點
Node* findNode(int value) {
    if (!head) return nullptr;
    Node* current = head;
    do {
        if (current->data == value) return current;
        current = current->next;
    } while (current != head);
    return nullptr;
}

// 交換指定結點與前驅結點的位置
bool swapWithPrior(Node* node) {
    if (!node || !node->prior) return false;  // 如果沒有前驅結點,不能交換

    Node* priorNode = node->prior;
    Node* nextNode = node->next;

    // 處理交換
    if (priorNode == head) {
        head = node;  // 如果是頭結點,特殊處理
    }

    priorNode->next = nextNode;
    if (nextNode) nextNode->prior = priorNode;

    node->next = priorNode;
    node->prior = priorNode->prior;
    if (priorNode->prior) priorNode->prior->next = node;
    priorNode->prior = node;

    return true;
}

// 輸出連結串列
void printList() const {
    if (!head) return;
    Node* current = head;
    do {
        cout << current->data;
        current = current->next;
    } while (current != head);
    cout << endl;
}

};

// 主函式
int main() {
int n, swapValue;
cin >> n; // 輸入元素個數
vector elements(n);
for (int i = 0; i < n; ++i) {
cin >> elements[i]; // 輸入元素值
}
cin >> swapValue; // 輸入要交換的元素值

CircularDoublyLinkedList cdll;
cdll.createList(elements);

Node* node = cdll.findNode(swapValue);

if (node == nullptr) {
    cout << "未找到" << swapValue << endl;
} else {
    if (cdll.swapWithPrior(node)) {
        cdll.printList();
    } else {
        cout << "未找到" << swapValue << endl;
    }
}

return 0;

}
程式碼解析
Node結構體:定義了連結串列的節點,包含資料data,指向前驅節點prior和後繼節點next。

CircularDoublyLinkedList類:包含了連結串列操作:

createList():根據輸入的元素建立一個雙向迴圈連結串列。
findNode():查詢值為value的節點。
swapWithPrior():交換當前節點和前驅節點的順序。如果交換成功,返回true,否則返回false。
printList():輸出連結串列中所有節點的資料。
主函式:

輸入節點的個數、節點的值和需要交換的節點的值。
建立連結串列並查詢需要交換的節點。
如果節點存在,執行交換操作並輸出結果。如果節點不存在,輸出“未找到”。
樣例輸入和輸出
輸入示例 1:

6
1 2 3 4 5 6
6
輸出示例 1:

123465
輸入示例 2:

5
10 20 30 40 50
60
輸出示例 2:

未找到60
關鍵注意事項
連結串列的迴圈結構:確保連結串列的最後一個節點指向頭節點,同時頭節點的前驅指向最後一個節點。
交換操作:確保節點交換時,前驅節點和後繼節點的指標正確更新。如果交換的是頭結點,還需要更新head指標。
輸入輸出:按照要求進行格式化輸出,確保輸入的節點數與節點值符合規範。
這樣,以上C++程式碼可以處理雙向迴圈連結串列中的結點交換問題。