1.题目描述
2.解题思路
2.1理解题意
2.2解决方法
2.3完整代码
3.小节
1.题目描述:
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点。
2.解题思路:
2.1理解题意:
题目要求移除链表中数据域中的值与val相等的节点
2.2解决方法:
如果该链表的头节点为空,返回该链表头节点即可;
if(head==null){
return head;
}
要删除链表中某一个节点的值,需要知道它上一个节点的指针域,将上一个节点的指针域指向改为该节点的下一个节点,但是如果头节点中的值与目标值相等的话,那么怎么删除呢?这时候我们就可以添加一个虚拟头节点,将它的指针域指向原链表的头节点
ListNode dummyNode = new ListNode(-1,head);
-1为虚拟头节点的值
head为虚拟头节点指针域:指向原链表中头节点的位置
定义变量pre,指向虚拟头结点dummyHead
ListNode pre = dummyNode;
如果头节点中的值是等于目标值,那么需要将当前变量所对应的节点的指针域指向当前变量所对应的节点的下下一个节点,继续判断下下一个节点的值是否等于目标值
如果头节点中的值不等于目标值,我们需要修改当前变量所对应的节点为下一个节点(将pre向链表的后方移动一位)
继续上述操作,当当前变量所对应的节点的指针域的值为空时,说明链表已经结束,返回头节点即可
2.3完整代码:
/**
* Definition for singly-linked list.
* 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; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
//新建一个虚拟头节点,数据域中存放值-1,head为指针域,该虚拟头节点指向头节点
ListNode dummyNode = new ListNode(-1,head);
//定义一个变量,指向虚拟头节点
ListNode pre = dummyNode;
//判断当前变量所对应的节点的下一个节点是否为空,如果为空,就说明链表后面没有其他元素,返回该链表的头节点即可
while(pre.next!=null){
//如果当前变量所对应的节点的下一个节点的值与目标值相等,那么需要将当前变量所对应的节点的指针域指向当前变量所对应的节点的下下一个节点
if(pre.next.val==val){
pre.next = pre.next.next;
}else{
//如果当前变量所对应的节点的下一个节点的值与目标值不相等,那么需要修改当前变量所对应的节点为下一个节点
pre = pre.next;
}
}
//返回修改后的链表的头节点
return dummyNode.next;
}
}
3.小节:
著此篇,与君享,互勉之,共进步!