题目
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点;
返回删除后的链表的头节点;
此次照原题有些许改动,参照leetcode
删除节点5;
解题分析
首先,这道题,我们要知道,单向链表的特点,单向链表其实就是内存里面的一块一块内存空间,是散乱排布的(区别于数组的连续内存空间),只是在前一个节点的内存空间里面有一个执行后一个节点的引用;就依靠这这个联系,把不同的节点关联在了一起,在这个链表中,节点4只知道他的下一个节点5的位置,至于节点5之后有没有节点,节点是谁,节点4是不知道的;
那么单向链表这种数据结构要怎么样删除一个节点的,举个例子,如果要删除节点5的话,我们需要知道节点5的下一个节点是谁(这个节点5里面有有保存),还有要持有节点5上一个节点的引用,因为删除节点5,我们要做的就是把节点4的下一个节点指向节点1,这样节点5没有被其他对象引用,不久就会被GC了,所以,在单向链表中想要删除一个节点,我们必须要知道这个节点的上一个节点,这点很重要;然后把这个节点的上一个节点的next引用指向这个节点的下一个节点;这也是单向链表的数据结构的特点,单向链表的节点是不能自我删除,双向链表是可以的;
如果是要删除头节点,我们只需要返回头节点的下一个节点即可;
再有我们要注意如果没有要删除的节点,注意不要出现空指针异常;
因为删除之后要返回整个链表的头,所以我们在遍历之前要保留原链表的头节点的引用,用来最后的返回;
代码(JAVA实现)
ps:这里笔者使用的jdk为1.8版本
class Solution {
public ListNode deleteNode(ListNode head, int val) {
if (Objects.isNull(head)) {
return null;
} else if (head.val == val) {
return head.next;
}
ListNode vir = head;
while (true) {
if (Objects.isNull(head.next)) {
break;
} else if (head.next.val == val) {
head.next = head.next.next;
break;
}
head = head.next;
}
return vir;
}
}