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;
        }
    }
    

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

  • 相关阅读:
    vs 2015 安装
    NPOI封装
    c#事件求解
    一个ERP系统的磕磕碰碰
    谁动了我的产品
    MVC Sesion丢失问题
    设计模式之类关系
    免费的SqlServer优化辅助工具:SqlOptimize (原创)
    Entity Framework Linq 简单笔记
    RhinoMocks简单范例
  • 原文地址:https://www.cnblogs.com/wenbaoli/p/5655723.html
Copyright © 2011-2022 走看看