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++代码可以处理双向循环链表中的结点交换问题。