设单链表的表头指针为i,结点结构( Link List) 由 data 和 next 两个域构成,其 中 data 域为字符型 。试设计算法判断该链表的全部 n 个字符是否中心对称 。例如 xyx、 xyyx 都是中心对称 。提示 :可以考虑栈的思想来实现。我需要C++算法代码
时间: 2024-10-27 14:05:48 浏览: 12
试写出一个计算单链表中结点个数的算法,其中指针p指向该链表的第一个结点。
你可以使用C++编写如下的代码来判断单链表是否中心对称:
```cpp
#include <iostream>
#include <stack>
struct Node {
char data;
Node* next;
};
// 创建新节点
Node* createNode(char data) {
Node* newNode = new Node();
newNode->data = data;
newNode->next = nullptr;
return newNode;
}
// 插入节点到链表
void insert(Node** head, char data) {
if (*head == nullptr) {
*head = createNode(data);
} else {
Node* temp = *head;
while (temp->next != nullptr) {
temp = temp->next;
}
temp->next = createNode(data);
}
}
// 判断链表是否中心对称
bool isSymmetric(Node* head) {
if (head == nullptr || head->next == nullptr) {
return true; // 空链表或只有一个元素都是中心对称的
}
std::stack<Node*> stack; // 使用栈辅助存储链表
Node* slow = head;
Node* fast = head->next;
while (fast && fast->next) {
stack.push(fast); // 先将右半部分的节点压入栈
slow = slow->next;
fast = fast->next->next;
}
// 检查剩余的左半部分是否等于反向的右半部分
if (fast) {
return false;
}
while (!stack.empty()) {
if (slow->data != stack.top()->data) {
return false;
}
stack.pop();
slow = slow->next;
}
return true;
}
int main() {
Node* head = nullptr;
// 添加节点构建链表...
if (isSymmetric(head)) {
std::cout << "链表中心对称。\n";
} else {
std::cout << "链表不是中心对称的。\n";
}
return 0;
}
```
这个算法首先创建一个栈并将右半部分的节点逐个压入栈中。然后通过两个指针`slow`和`fast`,让`fast`每次移动两步,直到`fast`达到链表尾部。此时,`slow`指向的是中心位置。接着比较`slow`和栈顶元素的数据,如果它们相等,继续遍历;如果不相等,则返回false。当栈为空时,说明链表是对称的。
阅读全文