剑指offer--在O(1)时间删除链表结点(Java)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40244153/article/details/88050412

题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
思路:
  通常那样从头开始查找删除需要的时间为O(n)
       要在O(1)时间删除某结点,可以这样实现:设待删除结点i的下一个结点为j,把j的值复制到i,再把i的指针指向j的下一个结点,最后删除j,效果就相当于删除j。
  注意特殊情况:1.当待删除结点i为尾结点时,无下一个结点,则只能从头到尾顺序遍历;2.当链表中只有一个结点时(即是头结点,又是尾结点),必须把头结点也设置为null。
  本题有个缺陷:要求O(1)时间删除,相当于隐藏了一个假设:待删除的结点的确在表中

注意:代码的返回结果不能为void,应该为头结点,因为若链表只有一个节点,需要删除,所以应该头结点指向null,并返回

考点:代码的完整性

实现:

public ListNode deleteNode(ListNode head, ListNode pToBeDeleted) {
        if(head == null ||pToBeDeleted == null) return head;
        if(head.next==null&&pToBeDeleted==head) head = null;
        if(pToBeDeleted.next!=null){
            pToBeDeleted.val = pToBeDeleted.next.val;
            pToBeDeleted.next = pToBeDeleted.next.next;
        }else{
            ListNode node = head;
            while(node.next.next!=null){
                node=node.next;
            }
            node.next=null;
        }
        return head;
    }

收获: 

  1.链表中删除结点的方法中,虽然直接令head=null了,但在主函数中的head还是不变,因此要令删除结点的返回值为ListNode,将返回值赋值给主函数中的head,这样才能实现真正的删除。
  2.另一种情况可以令删除函数返回值为void,只是需要定义一个头结点head(1中的head相当于是第一个结点),这个头结点中不存任何数据,仅仅起到指针的作用,第一个结点是头结点的下一个结点,通过对head.next操作,能够实现真正的删除。
  3.和链表有关的特殊情况:头结点,尾结点,链表仅一个结点,null等。

猜你喜欢

转载自blog.csdn.net/weixin_40244153/article/details/88050412
今日推荐