已知长度为 n(n>1)的带头结点的单链表,表头指针为工,结点结构由 data 和next 两个域构成,data 域为字符型,写出单链表结点定义,并设计判断单链表是否中心对称,要求时间复杂度为O(n) c语言写
时间: 2024-10-22 22:26:01 浏览: 31
C语言实现单链表(带头结点)的基本操作.zip
在C语言中,我们首先需要定义一个结构体来表示链表节点,包含数据域`data`和指向下一个节点的指针`next`。下面是链表节点的定义:
```c
typedef struct ListNode {
char data; // 数据域,存储字符型数据
struct ListNode* next; // 指向下一个节点的指针
} ListNode;
```
接下来,我们可以编写函数来判断单链表是否中心对称。为了达到O(n)的时间复杂度,我们将同时从链表的头部和尾部开始遍历。当遇到第一个非空节点时,我们在中间添加一个虚拟节点`mid`并更新其左右指针。然后,比较`mid->left`和`mid->right`指向的节点是否相等,直到两个指针都到达链表尾部。
以下是中心对称判断的函数实现:
```c
bool isSymmetric(ListNode* head) {
if (head == NULL || head->next == NULL) { // 链表为空或只有一个元素的情况
return true;
}
ListNode *slow = head; // 速度慢的指针,初始位置
ListNode *fast = head->next; // 速度快的指针,初始位置加一
ListNode *mid = new ListNode(); // 中间虚拟节点
while (fast && fast->next) {
slow->next = mid; // 将slow移动到mid
mid->next = fast->next; // 更新mid的右指针
mid->left = slow; // 更新mid的左指针
slow = slow->next;
fast = fast->next->next; // 快速指针前进两步
}
slow->next = mid->left ? NULL : mid->right; // 如果未到达链表尾部,继续比较左右两侧
while (mid->left) {
if (mid->left->data != mid->right->data) { // 如果找到不匹配的节点,返回false
return false;
}
mid->left = mid->left->next;
mid->right = mid->right->next;
}
return true; // 所有节点都匹配,链表是对称的
}
```
阅读全文