目录
一、题目
1、leetcode链接:力扣
2、题目内容:
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
二、解题思路
如下图,移除元素4
我们使用双指针,用fast指针指向要删除的节点,用row指针指向被删除节点的前一个节点 。
(1)判断head指针指向节点是否为要删除节点,若是,head指针指向下一个,直到head指针指向的节点不是要删除的节点
(2)fast指针指向head指针的下一个节点,row指针指向head 指针所在节点
(3)若fast指针指向不为空,指针fast和指针row同时移动一步,
①若fast指针指向需要被删除的节点,让row指针指向fast指针所指向的下一个节点,同时fast指针移动一步
②若fast指针指向不是被删除节点,row指针指向fast指针所指位置,然后fast指针移动一步
③若fast指针指向空,删除操作结束
(4)fast 指针为空,删除操作结束,返回指针head
三、具体代码实现
row指针只有在fast指针没有指向删除元素时,才需要和fast指针同时移动
public class lianbiao1 {
public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public ListNode removeElements(ListNode head, int val) {
while (head != null&&head.val==val) {
head=head.next;
}
if (head==null){
return head;
}
ListNode fast=head.next;
ListNode row=head;
while (fast!=null){
if (fast.val==val){
row.next=fast.next;
}else {
row=fast;
}
fast=fast.next;
}
return head;
}
}
四、链表专栏