算法设计题:设计一个算法用于判断带头结点的循环双链表是否对称。写出功能完全的代码
时间: 2024-09-28 12:13:34 浏览: 46
为了判断一个带头结点的循环双链表是否对称,我们可以使用两个指针,一个从头节点开始正向遍历,另一个从尾节点(通常指向头节点的前驱)开始逆向遍历。如果这两个指针在任何时候相遇并且它们指向的节点相等,那么链表是对称的。当其中一个指针到达链表尾部时,如果另一个还在链表内,说明链表不闭合,即不是循环链表;只有当两个指针都停止了,且都在链表内的同一个位置,才是循环对称。
以下是一个 C++ 的示例代码:
```cpp
class ListNode {
public:
int val;
ListNode *next, *prev;
ListNode(int x) : val(x), next(nullptr), prev(nullptr) {}
};
bool isSymmetric(ListNode* head) {
if (head == nullptr || head->next == nullptr) {
return true; // 非循环单链表或空链表都是对称的
}
ListNode* slow = head;
ListNode* fast = head->prev;
while (fast != nullptr && fast->prev != nullptr) {
if (slow != fast || slow->val != fast->val) {
return false; // 如果当前节点值不同或者两个指针没有同时到达,则不对称
}
slow = slow->next;
fast = fast->prev->prev;
}
return true; // 指针都到达了链表的同一侧,链表对称
}
```
在这个函数中,`slow` 和 `fast` 分别表示正向和逆向的遍历指针。如果链表有环但不对称,`fast` 将在某个时刻超过 `slow` 或者两者无法相遇,函数会返回 `false`。如果遍历结束且所有节点都匹配,那么链表是对称的。
阅读全文