标签:elements struct 列表 删除 else move nta delete 使用
删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
直接使用给定的头结点进行节点的删除。此时需要对头结点跟其他节点的删除进行分类讨论。
对于首节点的情况,我们先保存首节点的位置,再向后移动头指针,最后释放删除节点的空间。
while (head != NULL && head->val == val) { // 注意这里不是if
ListNode* tmp = head;
head = head->next;
delete tmp;
}
当退出循环时,可以确定的是首节点对应的值肯定不为目标值,我们再对非首节点的目标节点进行删除:
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;
}
}
为了避免影响头指针的位置,我们使用额外指针对链表剩余节点进行遍历。每次需要对当前结点和下一个结点是否为空进行讨论。
完整代码如下:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
// 先考虑头结点为目标值的情况
while (head != nullptr && head->val == val) {
// 先获取待删除元素 方便进行空间释放
ListNode* tmp = head;
head = head->next;
delete tmp;
}
// 退出上述循环说明首位元素值不为目标节点
// 使用另一个变量进行内部节点删除的循环
// 保持头结点位置正确性 方便进行返回
ListNode* cur = head;
while (cur != nullptr && cur->next != nullptr) {
if (cur->next->val == val) {
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}
else if (cur->next->val != val)
cur = cur->next;
}
return head;
}
};
不直接使用题目给定的头节点指针,在之前先添加一个虚节点,以此保证删除节点代码风格的统一。
ListNode* dummyNode =new ListNode(0);
dummyNode->next = head;
另外需要注意,在定义链表结构体的时候,我们采用构造函数初始值列表来进行初始化,冒号后以成员变量名(成员初始值)的形式进行初始化。
花括号内为空函数的原因是该列表的唯一目的是为数据成员赋初值,一旦没有其他任务需要执行,函数体也就为空了。
struct LinkedNode {
int val;
LinkedNode* next;
LinkedNode(int val):val(val), next(nullptr){}
};
最后所有元素按照链表内的节点删除来进行处理,完整代码如下:
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
// 先考虑头结点为目标值的情况
while (head != nullptr && head->val == val) {
// 先获取待删除元素 方便进行空间释放
ListNode* tmp = head;
head = head->next;
delete tmp;
}
// 退出上述循环说明首位元素值不为目标节点
// 使用另一个变量进行内部节点删除的循环
// 保持头结点位置正确性 方便进行返回
ListNode* cur = head;
while (cur != nullptr && cur->next != nullptr) {
if (cur->next->val == val) {
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}
else if (cur->next->val != val)
cur = cur->next;
}
return head;
}
};
标签:elements struct 列表 删除 else move nta delete 使用
原文地址:https://www.cnblogs.com/buryinshadow/p/14220605.html