Day68:删除链表的节点

48 阅读1分钟

Day20 2023/01/27

题目链接

难度:简单

题目

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

1.此题对比原题有改动

2.题目保证链表中节点的值互不相同

3.该题只会输出返回的链表和结果做对比,所以若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点

数据范围:

0<=链表节点值<=10000

0<=链表长度<=10000

示例

输入:{2,5,1,9},5
返回值:{2,1,9}
说明:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 2 -> 1 -> 9
复制代码

思路


从头开始遍历链表,比较节点数据,如果相等就删除,最后返回头节点即可。

关键点


  • 表头加入一个虚拟头节点,以便统一删除操作。
  • if判断里面使用cur->next->val,代表当前判断的是cur所指节点的下一个节点,方便删除操作(因为cur为当前判断节点的前驱节点)。

算法实现

  static ListNode delete(ListNode head,int target){
        ListNode temp = head;
        if (temp.data == target){
            temp = temp.next;
            return temp;
        }
       while (temp.next != null){
           if (temp.next.data != target){
               temp = temp.next;
           }else if (temp.next.data == target && temp.next.next != null){
               temp.next = temp.next.next;
               return head;
           } else if (temp.next.data == target && temp.next.next == null) {
               temp.next = null;
               return head;
           }
       }
       return head;
    }
}
  • 时间复杂度 O(n) --- 遍历链表,n为链表长度
  • 空间复杂度 O(1) --- 链表为必要空间,无额外辅助空间。

总结

  • 本题仅涉及链表的基础操作。