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
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++程式碼可以處理雙向迴圈連結串列中的結點交換問題。