一、题目分析与整体思路
在这个示例中,给定的val值是6,就将输入链表中的所有是6的节点给删除了。
整体思路:
1、将这个链表从头到尾遍历;
2、如果能找到值与val值相等的节点,就把该节点删除。
二、删除链表节点的操作
当我们遍历到需要删除的节点之后,这时候已经不能删除该节点了,所以,需要遍历到需要删除节点的前一个节点的时候,才能把这个节点删除。
因为想要删除该节点,就必须对该节点前面的指针进行操作,也只有current在被删除节点前一个的时候,才能对该指针进行操作。
删除的具体方式:cur.next = cur.next.next;
此方式表示当前指针的下一个节点指向了当前指针的下下个节点,当遍历这个链表的时候已经遍历不到当前指针的下个节点了,就相当于当前指针的下个节点已经被删除了。
三、头部处理
前面说到,当删除头节点的话是没办法删除的,current只能在头节点的前面,才可以删除掉头节点。
所以,我们需要一个虚拟头节点,把它放到头节点的前面,并且,current从虚拟头节点(dummyHead)开始遍历。那么,如果说头节点的值就是题目给定的value的话,current就可以在这里对头节点进行删除,所以,代码中应该:cur = dummy。
四、尾部处理
尾部处理,也就是这个循环的终止条件。
首先,current是不需要遍历到尾部节点的。如果尾部元素在是我们需要删除的节点的话,current只要在倒数第二个位置,就可以对它进行删除了。
在代码中可以这样判断:cur != null && cu.next != null。
五、Code
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummy = new ListNode(0);//建立虚拟头节点
ListNode cur = dummy;//让current从虚拟头节点开始遍历
cur.next = head;//current的下一个节点指向头节点
//对链表进行遍历,对需要删除的节点删除
while(cur != null && cur.next != null){
if(cur.next.val == val){
cur.next = cur.next.next;
}else{
cur = cur.next;
}
}
return dummy.next;//返回真正的头节点,就把整个链表进行返回
}
}