bool hasCycle(ListNode *head) { unordered_set<ListNode*> seen; while (head != nullptr) { if (seen.count(head)) { return true; } seen.insert(head); head = head->next; } return false; }能改成unordered_map写吗
时间: 2024-02-14 16:27:56 浏览: 113
当然可以将该函数改成使用`unordered_map`来实现。以下是使用`unordered_map`的修改版本:
```cpp
bool hasCycle(ListNode* head) {
unordered_map<ListNode*, bool> seen;
while (head != nullptr) {
if (seen[head]) {
return true;
}
seen[head] = true;
head = head->next;
}
return false;
}
```
在这个修改版本中,我们将`unordered_set<ListNode*> seen`改为`unordered_map<ListNode*, bool> seen`,其中键为`ListNode*`类型的指针,值为布尔类型,表示是否已经访问过该节点。当遍历链表时,如果遇到`seen[head]`已经存在(即该节点已经被访问过),则说明链表中存在环,返回`true`。否则,将`seen[head]`设置为`true`,并继续遍历下一个节点。如果遍历完整个链表都没有找到环,则返回`false`。
请注意,使用`unordered_map`相比于`unordered_set`会引入额外的内存开销,因为需要存储键-值对。但是由于题目只要求判断链表是否有环,所以这种修改是可行的。
相关问题
算法步骤如下: 1. 定义两个指针p和q,分别指向链表的头结点和尾结点。 2. 循环遍历链表,判断p和q指向的节点的值是否相等,如果不相等,则链表不对称,返回false。 3. 如果p和q指向的节点的值相等,则将p指向下一个节点,q指向上一个节点,继续判断。 4. 如果p和q相遇了,说明链表对称,返回true。 5. 如果链表为空或只有一个节点,则也是对称的,返回true。 完整代码如下: bool isSymmetric(ListNode* head) { if (head == NULL || head->next == NULL) { return true; } ListNode* p = head; ListNode* q = head->prev; while (p != q && q->next != p) { if (p->val != q->val) { return false; } p = p->next; q = q->prev; } return true; }
很抱歉,你的算法有误。首先,链表没有prev指针,应该是指向下一个节点的next指针。其次,你的代码中没有考虑到链表节点个数为奇数时的情况,会造成程序进入死循环。正确的代码如下:
```
bool isSymmetric(ListNode* head) {
if (head == NULL || head->next == NULL) {
return true;
}
ListNode* p = head;
ListNode* q = reverse(copy(head));
while (p != NULL && q != NULL) {
if (p->val != q->val) {
return false;
}
p = p->next;
q = q->next;
}
return true;
}
ListNode* copy(ListNode* head) {
if (head == NULL) {
return NULL;
}
ListNode* dummy = new ListNode(0);
ListNode* tail = dummy;
while (head != NULL) {
ListNode* node = new ListNode(head->val);
tail->next = node;
tail = tail->next;
head = head->next;
}
return dummy->next;
}
ListNode* reverse(ListNode* head) {
if (head == NULL) {
return NULL;
}
ListNode* prev = NULL;
ListNode* curr = head;
while (curr != NULL) {
ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
```
这个算法的思路是,首先将原链表复制一份,然后将复制的链表反转,最后比较原链表和反转后的链表是否相同。如果相同,说明链表是对称的。
阅读全文