剑指No.18_删除链表的节点
- 题目:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。
示例:输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
本题规定链表中没有重复元素,直接对链表进行遍历查找之后更改指针即可:
public ListNode deleteNodeWay(ListNode head, int val){
if (head.val == val){ // 有修改余地
head.val = head.next.val;
head.next = head.next.next;
return head;
}
ListNode temp = head; //需要注意
while (temp.next != null){
if (val == temp.next.val){
temp.next = temp.next.next;
return head;
}else {
temp = temp.next;
}
}
return null;
}
-
总结一下,temp=head的操作主要是为了在局部变量中保存head头节点的值不变始终处于第一个节点,以便于最后返回。由于只是将引用变量赋给了temp,所以temp与head指向同一个对象,修改temp的同时就是修改了此链表。
-
另外一点在判断如果要删除首节点的情况下,将下一个节点的值赋给首节点,再将首节点的next指针指向下一节点的next指针,就相当于变相删除了首节点。但由于本题只要求返回一个作为首节点的node,所以改为直接返回head.next会更简洁一点。
-
再添加一条如果首节点为空返回null,以防止访问null对象的val属性造成空指针异常。
修改后的代码为:
public ListNode deleteNodeWay(ListNode head, int val){
if (head == null) return null;
if (head.val == val){
return head.next;
}
ListNode temp = head;
while (temp.next != null){
if (val == temp.next.val){
temp.next = temp.next.next;
return head;
}else {
temp = temp.next;
}
}
return null;
}