思路:使用一个或者两个指针定位,检测head节点val是否等于value,如果等于就直接返回head.next。
检测指针的下一个节点val值是不是等于val,倘若等于,就另指针的下一个元素指向下下个元素(可能为null,不影响),此时返回head节点即可。 循环到结束没找到符合条件的节点,也直接返回head即可。
注意:假如题中给的不是val值,而是要删除的节点,则判断节点的next是不是null,如果是null。从head开始遍历,找到这个节点的上个节点,令其next=null即可。如果目标节点的next不为null,可以把它的val值改为下一个节点的val值,并且令 node.next=node.next.next。完成了删除操作。
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteNode(ListNode head, int val) {
if(head==null){
return head;
}
if(head.val==val){
head=head.next;
return head;
}
ListNode node = head;
while(node.next!=null){
if(node.next.val==val){
node.next=node.next.next;
return head;
}
node=node.next;
}
return head;
}
}
这个代码思路错了,以为给的是要删除的节点。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteNode(ListNode head, int val) {
if(head==null){
return null;
}
if(head.val==val){
head=head.next;
return head;
}
ListNode node =head;
while(node.next!=null){
node=node.next;
if(node.val==val){
if(node.next!=null){
node.val=node.next.val;
node.next=node.next.next;
return head;
}else{
ListNode node1 =head;
while(node1.next.val!=val){
node1=node1.next;
}
node1.next=null;
return head;
}
}
}
return head;
}
}