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

posted @ 2024-11-21 22:13  为啥不懂就问  阅读(5)  评论(0编辑  收藏  举报