在O(1)时间内删除链表结点 【微软面试100题 第六十题】
题目要求:
给定链表的头指针和一个结点指针,在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题 第六十题】的更多相关文章
- 【编程题目】在 O(1)时间内删除链表结点
60.在 O(1)时间内删除链表结点(链表.算法).题目:给定链表的头指针和一个结点指针,在 O(1)时间删除该结点.链表结点的定义如下:struct ListNode{int m_nKey;List ...
- 数据结构——算法之(027)( 在O(1)时间内删除链表结点)
[申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出. 联系邮箱:Mr_chenping@163.com] 题目:在O(1)时间内删除链表结点.且不知道链表头 题目分析: 1.把要删除节点的下 ...
- (剑指Offer)面试题13:在O(1)时间内删除链表结点
题目: 在给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间内删除该结点.链表结点与函数的定义如下: struct ListNode{ int val; ListNode* next; } ...
- P13在O(1)时间内删除链表结点
package offer; //在 O(1)时间删除链表结点 public class Problem13 { public static void main(String[] args) { Li ...
- 第六十题(在O(1)时间内删除链表结点)
题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点. 思路:将待删除节点下一个节点的数据赋给当前节点.删除下一个节点就可以.
- C++实现O(1)时间内删除链表结点
/* * 删除链表节点.cpp * * Created on: 2018年4月13日 * Author: soyo */ #include<iostream> using namespac ...
- JZ-069-在 O(1) 时间内删除链表节点
在 O(1) 时间内删除链表节点 题目描述 在 O(1) 时间内删除链表节点. 方案:如果该节点不是尾节点,那么可以直接将下一个节点的值赋给该节点,然后令该节点指向下下个节点,再删除下一个节点,时间复 ...
- 剑指Offer面试题:12.在O(1)时间删除链表结点
一.题目:在O(1)时间删除链表结点 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 原文采用的是C/C++,这里采用C#,节点定义如下: public class ...
- 【面试题013】在O(1)时间删除链表结点
[面试题013]在O(1)时间删除链表结点 我们要删除结点i,我们可以把结点i的下一个结点j的内容复制到结点i,然后呢把结点i的指针指向结点j的下一个结点.然后在删除结点j. 1.如果结点i位于链表 ...
随机推荐
- Android 自定义Adapter中实现startActivityForResult的分析
最近几天在做文件上传的时候,想在自定义Adapter中启动activity时也返回Intent数据,于是想到了用startActivityForResult,可是用mContext怎么也调不出这个方法 ...
- 如何在cmd查看文件内容的md5值
在cmd下进入 要查看的文件目录 默认目录是c,切换到其他盘符例如: C:\D: 就会切换到D盘 D:\ 然后输入命令 certutil -hashfile 文件名称.文件类型 MD5 如 cert ...
- Installing Apache, PHP, and MySQL on Mac OS X
I have installed Apache, PHP, and MySQL on Mac OS X since Leopard. Each time doing so by hand. Each ...
- 【UML】用例图Use Case diagram(转)
http://blog.csdn.net/sds15732622190/article/details/48858219 前言 总结完UML概述,就该说道UML中的九种图了,这九种图中,最先要说的,就 ...
- uva 1601 poj 3523 Morning after holloween 万圣节后的早晨 (经典搜索,双向bfs+预处理优化+状态压缩位运算)
这题数据大容易TLE 优化:预处理, 可以先枚举出5^3的状态然后判断合不合法,但是由于题目说了有很多墙壁,实际上没有那么多要转移的状态那么可以把底图抽出来,然后3个ghost在上面跑到时候就不必判断 ...
- Failed to load property source from location 'classpath:/applica)
: 1.注释错误(application.yml用的是#注释) 2.缩进采用tab而不是空格引起的(不同配置之间也不能有tab出现,否则会报错) 3.冒号后面必须有空格否则会报错
- 2018.2.27 JavaScript数组方法应用
JavaScript数组方法应用 1.找出元素item在给定数组arr中的位置 function indexOf(arr,item){ return arr.indexOf(item); } func ...
- js中替换字符串
function formatStr(str){ str=str.replace(/\r\n/ig,"<br/>"); return str; } 要注意两点: 要使用 ...
- xmpp 协议详解
XMPP(可扩展消息处理现场协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线现场探测.它在促进服务器之间的准即时操作.这个协议可能最终允许因特网用户向因特网上的其他任何人发送 ...
- vue中文本域限制字数的方法
用watch方法,来限制字数 <template> <div class="box"> <textarea v-model="title&q ...