题目:
实现思路:
因为链表是通过保存下一个节点的地址进行链接的,我们只需要获得需要删除的节点的前驱节点,把前驱节点指向的下一个节点改为当前节点的下一个节点即可。
本题依照题意,未使用虚拟节点。
设需要删除的节点为cur,其前驱节点为prev,实现的核心代码为:prev.next=cur.next
可以通过判断当前节点cur的下一个是否为需要删除的节点,如果是的话则直接将当前节点的下一个节点指向修改即可,实现代码为:cur.next = cur.next.next
两种实现方式逻辑相同,这里使用的是第二种。
实现代码:
/**
* 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) {
//如果第一个节点就是要删除的节点,则直接将其指向自己的下一个节点
while(head!=null && head.val == val){
head = head.next;
}
ListNode current = head;
while(current!=null){
while(current.next!=null && current.next.val == val){
current.next = current.next.next;
}
current = current.next;
}
return head;
}
}