1. 设单链表(不带头结点)中存放n个字符,试设计一个算法,判断该字符串是否中心对称(judging_symmetry)。,用c语言写
时间: 2024-10-12 17:08:06 浏览: 69
在C语言中,我们可以创建一个函数`judging_symmetry`来判断一个单链表存储的字符串是否中心对称。这里的关键在于我们需要遍历一半的链表,并将当前节点和它的对称位置(即链表长度减去它本身的位置再加一)的节点内容进行比较。如果所有对应位置的字符都相等,则说明字符串中心对称。
下面是一个简单的C语言实现示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct ListNode {
char data;
struct ListNode* next;
} ListNode;
// 创建链表节点
ListNode* createNode(char c) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->data = c;
newNode->next = NULL;
return newNode;
}
// 判断链表是否中心对称
int judging_symmetry(ListNode* head) {
if (head == NULL || head->next == NULL) {
// 如果链表为空或者只有一个元素,直接返回false
return 0;
}
ListNode* slow = head; // 慢指针
ListNode* fast = head->next; // 快指针
// 当快慢指针未相遇或相遇后均未到达链表尾部时继续移动
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
// 检查中心对称
ListNode* symmetryHead = slow->next; // 对称头指针,等于慢指针后一位
ListNode* symmetryCurrent = symmetryHead;
while (symmetryCurrent != NULL) {
if (slow->data != symmetryCurrent->data) {
return 0; // 字符不匹配,不是中心对称
}
slow = slow->next;
symmetryCurrent = symmetryCurrent->next;
}
return 1; // 所有字符匹配,是中心对称
}
// 测试函数
void printList(ListNode* head) {
while (head != NULL) {
printf("%c -> ", head->data);
head = head->next;
}
printf("NULL\n");
}
int main() {
// 示例链表构造
ListNode* list = createNode('a');
list->next = createNode('b');
list->next->next = createNode('c');
list->next->next->next = createNode('d');
list->next->next->next->next = createNode('a'); // 中心对称
printf("Original list: ");
printList(list);
if (judging_symmetry(list)) {
printf("The string is center symmetric.\n");
} else {
printf("The string is not center symmetric.\n");
}
return 0;
}
```
在这个例子中,`judging_symmetry`函数首先检查链表是否为空或只有一项。然后设置两个指针,一个慢慢移动(每次一步),另一个快速移动(每次两步)。当快指针到达链表尾部或结束时,慢指针所指向的就是中心位置。接着从这个位置开始,同时向前和向后遍历,比较对应位置的字符是否相同。如果所有字符都匹配,则中心对称;如果不匹配,则不是中心对称。
阅读全文