zoukankan      html  css  js  c++  java
  • 剑指Offer:面试题13——在O(1)时间删除链表结点

    问题描述:

    给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下:

    public class ListNode{
        int value;
        ListNode next;
        public ListNode(int v){value = v;}
    }

    思路:常规的做法就是遍历链表找到被删除结点的前趋p,然后改变p->next的指向即可。但是这种做法的时间复杂度为O(n)。

    因此我们要另寻他路。现在我们已知了要删除的结点指针,那么我们很容易获得它的后继,那么显然我们,我们可以直接将其后继内容放在该结点上,然后删除后继结点即可

    public void deleteNode(ListNode head, ListNode pToBeDeleted){
        if(head == null || pToBeDeleted == null){
            return;
        }
        ListNode q = pToBeDeleted->next;
        //要删除的不是尾结点
        if(q != null){
            pToBeDeleted->value = q -> value;
            pToBeDelted->next = q->next;
            q = null;
        }
        //链表只有一个结点,删除头结点(也是尾节点)
        else if(head == pTobeDeleted){
            pToBeDeleted = null;
            head = null;
        }else{//链表中有多个结点,删除尾结点
            ListNode q = head;
            while(q -> next != pToBeDeleted){
                q = q -> next;
            }
            q -> next = null;
            pToBeDeleted = null;
        }
    }
    

    上述代码基于一个假设:要删除的结点的确在链表中。

  • 相关阅读:
    CSU L: 就多了两分钟
    CSU 1112【机器人的指令】模拟
    P3388 【模板】割点(割顶)
    go 学习 2
    go 学习 1
    netconf协议
    lua 学习 5
    lua 学习 4
    lua 学习 3
    lua 学习 2
  • 原文地址:https://www.cnblogs.com/wenbaoli/p/5655723.html
Copyright © 2011-2022 走看看