题目描述
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
方法一:
/**
* 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) {
ListNode start = head;
if(start.val == val){
start = start.next;
}
while(head.next != null){
if(head.next.val == val){
head.next = head.next.next;
}else{
head = head.next;
}
}
return start;
}
}
第一个元素要单独考虑,如果第一个元素不考虑的话,假如第一个节点的值和待删除的值相同,则无法删除
方法二:
双指针:
新建一个空的头结点,指向head,slow指针指向删除节点的前驱,quick指向要删除的节点,不需要单独考虑第一个元素
/**
* 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) {
boolean find = false;
ListNode first = new ListNode(-1);
first.next = head;
ListNode slow = first;
ListNode quick = head;
while(quick != null){
if(quick.val == val){
find = true;
break;
}
slow = slow.next;
quick = quick.next;
}
if(!find){
return head;
}
slow.next = quick.next;
return first.next;
}
}