剑指offer | 面试题18:删除链表的节点_链表

开始行动,你已经成功一半了,献给正在奋斗的我们

 

题目

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点;

返回删除后的链表的头节点;

此次照原题有些许改动,参照leetcode

剑指offer | 面试题18:删除链表的节点_链表_02
删除节点5;
剑指offer | 面试题18:删除链表的节点_数据结构_03

解题分析

首先,这道题,我们要知道,单向链表的特点,单向链表其实就是内存里面的一块一块内存空间,是散乱排布的(区别于数组的连续内存空间),只是在前一个节点的内存空间里面有一个执行后一个节点的引用;就依靠这这个联系,把不同的节点关联在了一起,在这个链表中,节点4只知道他的下一个节点5的位置,至于节点5之后有没有节点,节点是谁,节点4是不知道的;
剑指offer | 面试题18:删除链表的节点_数据结构_04
那么单向链表这种数据结构要怎么样删除一个节点的,举个例子,如果要删除节点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;
    }
}

剑指offer | 面试题18:删除链表的节点_链表_05


剑指offer | 面试题18:删除链表的节点_单向链表_06
喜欢的朋友可以加我的个人微信,我们一起进步