给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1
输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7
输出:[]
提示:
列表中的节点数目在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
//精简后
class Solution {
public:
ListNode* removeElements(ListNode* head, int val)
{
ListNode* current = head; //令当前节点为头节点
while (current != nullptr) //当前节点不为空
{
if (current->next != nullptr && current->next->val == val)//下一节点不为空且下一节点的值为val需要删掉
{
current->next = current->next->next; // 更新下一节点
}else
{
current = current->next; //更新当前节点,若当前节点为尾节点,结束判断,若下一节点不需要删掉,则继续循环进行判断
}
}
if (head != nullptr && head->val == val) //最后判断头节点
{
return head->next; //如果头节点值和给定值相等,删掉头节点
}else
{
return head; //头节点为空,返回空链表,头节点不为空且值不等于给定值,返回更新后的链表
}
}
};
//原来的啰嗦写法
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
//从头节点开始,判断头节点是否为空,空值直接返回head
//链表不为空,则将头节点设为当前节点,判断当前节点下一节点是否为空
//如果为空,结束循环,判断头节点是否为给定值,不是的话返回head,是的话返回空链表
//如果不为空,判断下一节点的值是否为给定值,是给定值,判断下一节点的下一节点是否为空,空
//为空:将当前节点指向空指针,判断头节点是否为给定值,不是的话返回head,是的话返回空链表
//不为空:将下一节点的下一节点 更新为 当前节点的下一节点,在判断当前节点的下一节点是否为给定值
// 是给定值,重复38,不是给定值,更新当前节点,判断当前节点的下一节点是否为空,重复37,38
//直到判断完所有的,判断头节点的值,不是就返回head,等于val则更新头节点返回新链表
ListNode* current_node = head;
if (head == nullptr)
return head;
else
{
for (current_node; current_node != nullptr;)
{
if (current_node->next == nullptr)
{
if (head->val == val)
return head = head->next;
else
return head;
}
else
{
if ((current_node->next)->val == val) // 如果当前节点的的下一个节点等于这个值
{
if ((current_node->next)->next != nullptr) //下一节点的下一节点 不为空
{
current_node->next = (current_node->next)->next; //更新下一节点
}
else //下一节点即为最后一个节点
{
current_node->next = nullptr; //删掉最后一个节点,当前节点变为最后一个节点
}
}
else
{
current_node = current_node->next; //只有值不等时才更新当前节点
}
}
}
}
return head;
}
};