给你一个链表的头节点 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
- 0
解题思路:
1、判空
2、创建一个虚头结点Head并拼接在链表头部:ListNode *Head=new ListNode(0,head);。调用的是结构体ListNode中的ListNode(int x, ListNode *next) : val(x), next(next) {},使虚头结点Head val值为0,所要连接的节点是head。
3、构建快慢指针,快指针指向头结点head,慢指针指向虚头结点Head。
4、循环遍历查找所有满足 Node.val == val 的节点,找到了,删除该元素:slow->next=fast->next;(即慢指针直接与快指针节点相连)同时快指针向后走一步;若没找到,快、慢指针向后走一步。
循环条件:快指针存在。
5、返回新的头节点,Head->next才是新的头节点 。
画图演示:
① 构建快、慢指针及虚头结点,快指针指向头结点head,慢指针指向虚头结点Head。
② 该节点不满足 Node.val == val,快、慢指针都向后走一步。
③ 该节点满足 Node.val == val,删除该元素,慢指针直接与快指针节点相连,同时快指针向后走一步。
④ 重复②③步,直至循环停止,即快指针不存在。
代码实现:
/**
* Definition for singly-linked list.
* 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) {
//判空
if(!head) return head;//if(head==nullptr) return nullptr;
//创建虚头结点并拼接
ListNode *Head=new ListNode(0,head);//val=0,Head->next=head
ListNode *fast=head;//快指针
ListNode *slow=Head;//慢指针
while(fast){//fast存在
if(fast->val==val){//如果是被移除的元素
slow->next=fast->next;//删除该元素
fast=fast->next;
}
else{
slow=slow->next;
fast=fast->next;
}
}
return Head->next;//返回新的头节点,Head->next才是新的头节点
}
};