题目要求:

  给定链表的头指针和一个结点指针,在O(1)时间删除该结点。

  参考资料:剑指offer第13题。

题目分析:

  有几种情况:

    1.删除的结点是头结点,且链表不止一个结点;

    2.删除的结点是头结点,且链表只有一个结点;

    3.删除的结点是尾结点,且链表不止一个结点;

    4.删除的结点不是头也不是尾结点;

  对于第四种情况(普遍情况),见如下图分析:

  对于第三种情况,时间复杂度为O(n).其他情况时间复杂度为O(1).则总的平均复杂度为[(n-1)*O(1)+O(n)]/n = O(1).

代码实现:

  

#include <iostream>
#include <stack> using namespace std; typedef struct ListNode
{
struct ListNode *next;
int data;
}ListNode; void InitList(ListNode **head1,ListNode **toBeDelete);
void DeleteListNode(ListNode **pHead,ListNode *pToBeDelete);
void PrintList(ListNode *list); int main(void)
{
ListNode *h,*toBeDelete; InitList(&h,&toBeDelete);
PrintList(h);
cout <<"删除5" << endl;
DeleteListNode(&h,toBeDelete);
PrintList(h); return ;
}
void PrintList(ListNode *list)
{
while(list!=NULL)
{
cout << list->data << "->"; list = list->next;
}
cout << "NULL";
cout <<endl;
}
void DeleteListNode(ListNode **pHead,ListNode *pToBeDelete)
{
if(!pHead || !(*pHead) || !pToBeDelete)
return ;
//情况1
if(*pHead==pToBeDelete && pToBeDelete->next != NULL)
{
*pHead = pToBeDelete->next;
delete pToBeDelete;
}
//情况4
else if(pToBeDelete->next != NULL)
{
ListNode *pNext = pToBeDelete->next;
pToBeDelete->data = pNext->data;
pToBeDelete->next = pNext->next;
delete pNext;
pNext = NULL;
}
//情况2
else if(*pHead==pToBeDelete)
{
delete pToBeDelete;
pToBeDelete = NULL;
*pHead = NULL;
}
//情况3
else
{
ListNode *pNode = *pHead;
while(pNode->next != pToBeDelete)
pNode = pNode->next;
pNode->next = NULL;
delete pToBeDelete;
pToBeDelete = NULL;
}
}
//head:1-->5-->9-->NULL
void InitList(ListNode **head1,ListNode **toBeDelete)
{
ListNode *tmp = new ListNode;
tmp->data = ;
*head1 = tmp; tmp = new ListNode;
tmp->data = ;
(*head1)->next = tmp;
*toBeDelete = tmp; ListNode *tmp1 = new ListNode;
tmp1->data = ;
tmp1->next = NULL;
tmp->next = tmp1;
}

在O(1)时间内删除链表结点 【微软面试100题 第六十题】的更多相关文章

  1. 【编程题目】在 O(1)时间内删除链表结点

    60.在 O(1)时间内删除链表结点(链表.算法).题目:给定链表的头指针和一个结点指针,在 O(1)时间删除该结点.链表结点的定义如下:struct ListNode{int m_nKey;List ...

  2. 数据结构——算法之(027)( 在O(1)时间内删除链表结点)

    [申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出. 联系邮箱:Mr_chenping@163.com] 题目:在O(1)时间内删除链表结点.且不知道链表头 题目分析: 1.把要删除节点的下 ...

  3. (剑指Offer)面试题13:在O(1)时间内删除链表结点

    题目: 在给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间内删除该结点.链表结点与函数的定义如下: struct ListNode{ int val; ListNode* next; } ...

  4. P13在O(1)时间内删除链表结点

    package offer; //在 O(1)时间删除链表结点 public class Problem13 { public static void main(String[] args) { Li ...

  5. 第六十题(在O(1)时间内删除链表结点)

    题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点. 思路:将待删除节点下一个节点的数据赋给当前节点.删除下一个节点就可以.

  6. C++实现O(1)时间内删除链表结点

    /* * 删除链表节点.cpp * * Created on: 2018年4月13日 * Author: soyo */ #include<iostream> using namespac ...

  7. JZ-069-在 O(1) 时间内删除链表节点

    在 O(1) 时间内删除链表节点 题目描述 在 O(1) 时间内删除链表节点. 方案:如果该节点不是尾节点,那么可以直接将下一个节点的值赋给该节点,然后令该节点指向下下个节点,再删除下一个节点,时间复 ...

  8. 剑指Offer面试题:12.在O(1)时间删除链表结点

    一.题目:在O(1)时间删除链表结点 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 原文采用的是C/C++,这里采用C#,节点定义如下: public class ...

  9. 【面试题013】在O(1)时间删除链表结点

    [面试题013]在O(1)时间删除链表结点  我们要删除结点i,我们可以把结点i的下一个结点j的内容复制到结点i,然后呢把结点i的指针指向结点j的下一个结点.然后在删除结点j. 1.如果结点i位于链表 ...

随机推荐

  1. springboot+shiro+cas实现单点登录之cas server搭建

    CAS是YALE大学发起的一个开源项目,旨在为web应用系统提供一种可靠的单点登录方法.它主要分为client和server端,server端负责对用户的认证工作,client端负责处理对客户端受保护 ...

  2. mongodb Limit操作

    Limit() 方法 要限制 MongoDB 中的记录,需要使用 limit() 方法. limit() 方法接受一个数字型的参数,这是要显示的文档数. 语法: limit() 方法的基本语法如下 & ...

  3. AngularJS(二):ng-app指令、表达式

    本文也同步发表在我的公众号“我的天空” ng-app指令 AngularJS指令是扩展的HTML属性,所有指令均带有前缀“ng-”,我们学习的第一个指令便是ng-app,其定义了AngularJS管理 ...

  4. ABAP数据转换规则

    数据转换规则: 可以将基本数据类型的源字段内容赋给其它基本数据类型的目标字段(除了数据类型 D 无法赋给数据类型 T,反之亦然).ABAP/4 也支持结构化数据和基本数据对象之间或结构不同的数据对象之 ...

  5. Git基础使用教程(仓库初始化,源码clone,源码push)

    一.下载Git源码管理客户端 Git下载地址:https://git-scm.com/ 二.检查电脑是否已安装Git 1)已安装:输入git出现下图提示则代表已安装成功. 2)未安装情况下git会出现 ...

  6. linux 查看dd进度

    Linux下显示dd命令的进度: dd if=/dev/zero of=/tmp/zero.img bs=10M count=100000 想要查看上面的dd命令的执行进度,可以使用下面几种方法: 比 ...

  7. 获取元素Bytagname区别/for循环应用

    一:两种获取元素方式的区别.1.var aLi = oUl.getElementsByTagName('li');TagName前面可以加其他东西,id就只能是document,2,Id是静态的,ta ...

  8. Securityonion介绍

        下载地址     https://github.com/Security-Onion-Solutions/security-onion/blob/master/Verify_ISO.md   ...

  9. Windows 7, Visual Studio 2015下编译Webkit

    因工作需要,需要编译Windows版本的Webkit,中间走了不少弯路,都记录下来,供大家参考!也随时欢迎大家讨论(QQ群:345802342) 整个编译工作参考的是官方文档:https://webk ...

  10. Python3获取大量电影信息:调用API

    实验室这段时间要采集电影的信息,给出了一个很大的数据集,数据集包含了4000多个电影名,需要我写一个爬虫来爬取电影名对应的电影信息. 其实在实际运作中,根本就不需要爬虫,只需要一点简单的Python基 ...