题目描述:
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
1、此题对比原题有改动
2、题目保证链表中节点的值互不相同
3、该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点
数据范围:
0<=链表节点值<=10000
0<=链表长度<=10000
示例1
输入:{2,5,1,9},5
返回值:{2,1,9}
说明:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 2 -> 1 -> 9
示例2
输入:{2,5,1,9},1
返回值:{2,5,9}
说明:给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 2 -> 5 -> 9
解法一:双指针
思路:
遍历链表,用两个指针分别指向当前节点和当前节点的前一节点。当当前节点的val值和要删除的值相同时,让当前节点的前一节点直接指向当前节点的下一节点即可。
注意点:如果头节点即为要删除的节点值,直接返回头结点的下一节点即可。
代码:
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param val int整型
* @return ListNode类
*/
public ListNode deleteNode (ListNode head, int val) {
//如果头节点的val值等于val,则直接返回head的下一个节点
if(head.val == val){
return head.next;
}
//slow:当前元素的前一个节点 fast:当前元素
ListNode slow = head, fast = head.next;
//遍历链表
while(fast != null){
//如果当前节点的val值等于val,则让当前节点的前一节点指向当前节点的下一节点,跳出循环
if(fast.val == val){
slow.next = fast.next;
break;
}else{ //否则,fast和slow都向后遍历
fast = fast.next;
slow = slow.next;
}
}
return head;
}
}
解法二:单个指针
思想:
思路与解法一基本一致,不同点就在于使用了一个指针就完成了遍历。
代码:
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param val int整型
* @return ListNode类
*/
public ListNode deleteNode (ListNode head, int val) {
//如果头节点的val值等于val,则直接返回head的下一个节点
if(head.val == val){
return head.next;
}
//cur:当前元素
ListNode cur = head;
//遍历链表
while(cur.next != null){
//如果当前节点的val值等于val,则让当前节点的前一节点指向当前节点的下一节点,跳出循环
if(cur.next.val == val){
cur.next = cur.next.next;
break;
}else{ //否则,cur向后遍历
cur= cur.next;
}
}
return head;
}
}