题目要求:

  给定链表的头指针和一个结点指针,在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. 集合(List、Set)

    第19天 集合 第1章 List接口 我们掌握了Collection接口的使用后,再来看看Collection接口中的子类,他们都具备那些特性呢? 接下来,我们一起学习Collection中的常用几个 ...

  2. spring data jpa 简单使用

    通过解析方法名创建查询 通过前面的例子,读者基本上对解析方法名创建查询的方式有了一个大致的了解,这也是 Spring Data JPA 吸引开发者的一个很重要的因素.该功能其实并非 Spring Da ...

  3. When you want to give up, remember why you started.

    When you want to give up, remember why you started.当你想要放弃的时候,请记住当初你为何而开始.

  4. Android商城开发系列(五)—— 商城首页回到顶部和搜索框布局实现

    今天我们来开发商城的首页[输入搜索框]布局和点击右下角图片回到顶部的效果 搜索功能在App中很常见,尤其是在商城类的项目当中,一般都会提供很强大的搜索功能,App的搜索布局一般都是在App的顶部,如下 ...

  5. JavaScript 的 parseInt 取整

    http://www.neoease.com/javascript-get-integer-via-parseint/ JavaScript 是弱类型语言, 为了保证数值的有效性, 在处理数值的时候, ...

  6. LibreOJ #100. 矩阵乘法

    内存限制:256 MiB 时间限制:2000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 上传者: 匿名     模版 以前一直不过样例原来是读入优化没写负数.. 屠龙宝刀点击就送 #in ...

  7. ceisum_加载倾斜摄影模型

    osgb转换为3Dtiles格式(使用工具转换) 然后加载到cesium中(加载代码见下,可以控制模型高度) var offset = function(height,tileset) { conso ...

  8. 弄了一个星期的wp 8.1,吐血的感觉

    看到8.1出来这么久了,心痒难耐,忍不住想重新把应用写一遍,于是上个星期开始动手,用的mvvm模式,结果一路下来,sqlce不能用了,那好吧,我用sqlite,webrequest变成httpclie ...

  9. NSStream实现发送和接受数据

    一.基本概念在iOS中以NSStream(流)来发送和接收数据,可以设置流的代理,对流状态的变化做出相应.1连接建立2接收到数据3连接关闭NSStream:数据流的父类,用于定义抽象特性,例如:打开. ...

  10. NOIP模拟赛 不等数列

    [题目描述] 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”.问在所有排列中,有多少个排列恰好有k个“<”.答案对2012取模. [输入格式] 第一行 ...