ListNode* deleteDuplicates(ListNode* head) { if (!head || !head->next) { return head; } ListNode* cur = head; while (cur->next) { if (cur->val == cur->next->val) { cur->next = cur->next->next; } else { cur = cur->next; } } return head; }这里面为什么操作的是cur但是返回的是head
时间: 2024-02-11 11:25:44 浏览: 87
在这段代码中,我们使用cur指针来遍历链表,找到重复的节点并删除。cur指针始终指向当前节点,而head指针始终指向链表的头部。
我们通过cur指针遍历链表,如果发现当前节点的值与下一个节点的值相同(即存在重复节点),我们将当前节点的next指针指向下一个节点的next指针,从而跳过了下一个节点,实现了删除操作。如果当前节点与下一个节点的值不相同,我们将cur指针指向下一个节点,继续遍历。
最后,我们返回的是head指针,因为head指针始终指向链表的头部,并且在遍历过程中没有发生变化,所以返回head可以保证返回的是整个链表的头部。
相关问题
ListNode* deleteDuplicates(ListNode* head) { if (!head || !head->next) { return head; } ListNode* cur = head; while (cur->next) { if (cur->val == cur->next->val) { cur->next = cur->next->next; } else { cur = cur->next; } } return head; }怎么释放已经删除的节点的空间
在这段代码中,已经删除的节点的空间并没有被显式地释放。这是因为在C++中,删除节点的操作只是将节点从链表中移除,并没有实际释放节点所占用的内存空间。这是一个常见的做法,因为在链表结构中,我们无法直接访问到被删除节点之后的节点,所以无法直接释放被删除节点的内存。
在实际使用中,如果需要释放已删除节点的内存空间,可以通过遍历整个链表,逐个删除节点并释放内存。以下是一个示例代码:
```cpp
ListNode* deleteDuplicates(ListNode* head) {
if (!head || !head->next) {
return head;
}
ListNode* cur = head;
while (cur->next) {
if (cur->val == cur->next->val) {
ListNode* temp = cur->next;
cur->next = cur->next->next;
delete temp; // 释放删除节点的内存空间
} else {
cur = cur->next;
}
}
return head;
}
```
在这个示例中,我们使用了`delete`操作符来释放被删除节点的内存空间。请注意,这里我们假设链表中的节点是使用`new`操作符动态分配的内存空间,如果节点是栈上的局部变量或者是静态分配的内存空间,则不需要手动释放。
此外,还可以考虑使用智能指针(如`std::shared_ptr`或`std::unique_ptr`)来管理节点的内存,这样可以避免手动释放内存的问题。
ListNode* cur = head; while (cur != NULL && cur->next!= NULL) { if (cur->next->val == val) { //ListNode* tmp = cur->next; cur->next = cur->next->next; //delete tmp; } else { cur=cur->next; } } 其中 cur->next = cur->next->next; 和cur=cur->next; 的区别
) { // 访问当前节点 // ... cur = cur->next; } 这段代码是什么意思?
这段代码是遍历链表的标准代码。cur 是一个指向链表头的指针,通过 while 循环遍历整个链表,每次迭代将 cur 指针指向下一个节点,直到 cur 指向空节点结束。在循环体中可以对当前节点进行一些操作或者访问。
阅读全文