1. 问题描述:
删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-linked-list-elements/
2. 思路分析:
① 其实题目很好理解,对于删除的链表元素,我们只需要修改其中的指针指向即可解决,需要使用一个ListNode节点来保存正在遍历的节点的上一个节点,这样在找到需要删除节点的时候只需要将上一个节点的next指针域指向当前节点的下一个节点即可达到删除节点的目的,这里需要注意以下几个问题:
1)当删除的为头结点的时候只需要将头指针往下移动即可
2)当遍历的元素为删除的元素的时候需要将上一个元素的next指针域指向下一个节点即可
3)当遍历的元素不是上一个节点的时候,前一个指针域当前的指针都往下移动即可
② 整体的思路还是比较好理解的,删除元素只需要改变指针的指向即可完成
3. 代码如下:
提交到领扣代码:
import java.util.Scanner;
public class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode p = head;
/*需要使用一个前缀节点来保存当前节点的上一个节点*/
ListNode pre = null;
while (p != null){
if (p == head && p.val == val) {
head = head.next;
p = head;
}
else if (p.val == val){
pre.next = p.next;
p = pre.next;
}else {
pre = p;
p = p.next;
}
}
return head;
}
}
添加测试代码:
import java.util.Scanner;
public class Solution {
/*链表节点*/
public static class ListNode{
private int val;
private ListNode next;
public ListNode(int val) {
this.val = val;
}
/*重写tostring方法用来输出链表的值*/
@Override
public String toString() {
return val + " ";
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ListNode head = new ListNode(1);
ListNode next = new ListNode(2);
head.next = next;
ListNode next2 = new ListNode(6);
next.next = next2;
ListNode next3 = new ListNode(3);
next.next = next3;
ListNode next4 = new ListNode(4);
next3.next = next4;
ListNode next5 = new ListNode(5);
next4.next = next5;
ListNode next6 = new ListNode(6);
next5.next = next6;
next6.next = null;
head = removeElements(head, 6);
while (head != null){
System.out.print(head);
head = head.next;
}
}
public static ListNode removeElements(ListNode head, int val) {
ListNode p = head;
/*需要使用一个前缀节点来保存当前节点的上一个节点*/
ListNode pre = null;
while (p != null){
if (p == head && p.val == val) {
head = head.next;
p = head;
}
else if (p.val == val){
pre.next = p.next;
p = pre.next;
}else {
pre = p;
p = p.next;
}
}
return head;
}
}