-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDeleteNode.cpp
More file actions
42 lines (40 loc) · 1.38 KB
/
DeleteNode.cpp
File metadata and controls
42 lines (40 loc) · 1.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/// 18 删除链表的节点
/// O(1)时间的删除 由调用者保证正确性
struct ListNode {
int val;
ListNode* next;
};
class Solution {
public:
void DeleteNode(ListNode** head, ListNode* pToBeDeleted)
{
if (!head || !pToBeDeleted)
return;
//待删除结点不是尾节点
if (pToBeDeleted->next != nullptr) {
/// 复制下一节点的值 并删除下一节点
/// 此节点存在 且不为尾节点
ListNode* next = pToBeDeleted->next;
pToBeDeleted->val = pToBeDeleted->next->val;
pToBeDeleted->next = pToBeDeleted->next->next;
// 在LeetCode中不要这样做,不要尝试释放内存,会触发内存访问错误
delete next;
next = nullptr;
} else if (*head == pToBeDeleted) {
/// 只有头节点的情况
delete pToBeDeleted;
pToBeDeleted = nullptr;
*head = nullptr;
} else {
/// 链表中有多个节点 删除尾节点的情况
ListNode* curr_node = *head;
/// 正常的从头遍历至倒数第二个节点
while (curr_node->next != pToBeDeleted) {
curr_node = curr_node->next;
}
curr_node->next = nullptr;
delete pToBeDeleted;
pToBeDeleted = nullptr;
}
}
};