剑指 Offer 每日一题 | 15、删除链表的节点

507 阅读2分钟

一、前言

大家好,本文章属于《剑指 Offer 每日一题》中的系列文章中的第 15 篇。

在该系列文章中我将通过刷题练手的方式来回顾一下数据结构与算法基础,同时也会通过博客的形式来分享自己的刷题历程。如果你刚好也有刷算法题的打算,可以互相鼓励学习。我的算法基础薄弱,希望通过这两三个月内的时间弥补这块的漏洞。本次使用的刷题语言为 Java ,预计后期刷第二遍的时候,会采用 Python 来完成。

二、题目

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

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

示例1:

 输入: head = [4,5,1,9], val = 5
 输出: [4,1,9]
 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.

示例2:

 输入: head = [4,5,1,9], val = 1
 输出: [4,5,9]
 解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.

三、解题思路

在单链表中删除一个节点,常规的做法就是无疑从头节点开始,顺序遍历查找要删除的节点,并在链表中删除该节点。

本题就在于考察单链表的删除,思路很简单, 比如 p->q ;q->r ,要删除 q 节点,就让 p->r 即可。

3.1 代码

 public ListNode deleteNode3(ListNode head, int val) {
         if(head ==null) return null;
         if(head.val == val) return head.next;
         ListNode cur = head;
         // 如果链表的下一节点不为null ,且值不相等,则递归到下一个结点
         while (cur.next !=null && cur.next.val !=val){
             cur =cur.next;
         }
         // 退出循环的条件要么走完了链表,要么找到了链表,如果找到 就删除它。
         if(cur.next !=null){
             cur.next=cur.next.next;
         }
         return head;
     }

3.2 执行效果

image-20210827194225366

3.3 复杂度分析

  • 时间复杂度 O(N)
  • 空间复杂度 O(1)

四、小结

本题考察了对链表的编程能力,考察了对单链表的删除。