剑指offer-面试题13.在O(1)时间删除链表节点

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

链表节点与函数的定义如下。

 

通常我们删除某个节点都是从头开始遍历到需要删除节点的前一个节点。

然后使得该节点的next指向删除节点的next即可,这样看来删除一个节点

的复杂度为O(n)然而我们其实遍历的目的只是想获取想要删除节点的前一

个节点。

 

 

那么我们可以这样考虑:

我们把要删除节点下一个节点的值赋值到当前节点,然后将当前节点的下一个

节点删除即可。

 

比如:

一个链表3->2->5->7->9给定的指针指向5也就是说要删除5这个节点。

我们将节点5下个节点的值赋值给需要删除的节点即:

3->2->7->7->9

然后再p->next=p->next->next即可删除

 

代码实现如下:

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     struct ListNode *next;
 6  * };
 7  */
 8 void deleteNode(struct ListNode* node) 
 9 {
10         if(node==NULL)
11         return;
12 
13     struct ListNode* p,*q;
14     q=node;
15     p=node->next;
16     q->val=p->val;
17     q->next=p->next;
18 
19 }

 

勘误:

上面的方法没有考虑到当要删除的结点是尾结点的情况

因此当需要删除的结点为尾结点的时候这时候仍需要

从头遍历到尾结点的前面一个结点。

但是算法复杂度仍然为1,因为只有一个尾结点需要遍历

整个链表,复杂度为(O(n)+O(1)*(n-1))/n=O(1)

 

代码实现如下:

  1 #include <iostream>
  2 using namespace std;
  3 
  4 /**
  5 * Definition for singly-linked list.
  6 * struct ListNode {
  7 *     int val;
  8 *     struct ListNode *next;
  9 * };
 10 */
 11 struct ListNode 
 12 {
 13     int val;
 14     struct ListNode *next;
 15 };
 16 
 17 ListNode *head;
 18 
 19 void deleteNode(struct ListNode* node) 
 20 {
 21     if(node==NULL)
 22         return;
 23     if(node->next==NULL)
 24     {
 25         ListNode *TempHead;
 26         TempHead=head;
 27         while(TempHead->next->next!=NULL)
 28         {
 29             TempHead=TempHead->next;
 30         }
 31         TempHead->next=NULL;
 32         return;
 33     }
 34 
 35 
 36     struct ListNode *p,*q;
 37     q=node;
 38     p=node->next;
 39     q->val=p->val;
 40     q->next=p->next;    
 41 }
 42 
 43 
 44 ListNode* CreateList()
 45 {
 46     ListNode *Head,*p;
 47     Head=(ListNode*)malloc(sizeof(ListNode));
 48     if(Head==NULL)
 49         return NULL;
 50 
 51     Head->val=0;
 52     Head->next=NULL;
 53     p=Head;
 54     while(true)
 55     {
 56         int data;
 57         cout<<"Please input Node data: ";
 58         cin>>data;
 59         if(data==0)
 60         {
 61             break;
 62         }
 63         else
 64         {
 65             ListNode* NewNode;
 66             NewNode=(ListNode*)malloc(sizeof(ListNode));
 67             NewNode->val=data;
 68             NewNode->next=NULL;
 69             p->next=NewNode;
 70             p=p->next;
 71         }
 72     }
 73 
 74 
 75     return Head->next;
 76 }
 77 
 78 
 79 void PrintList(ListNode* Head)
 80 {
 81     ListNode *p;
 82     p=Head;
 83 
 84     while(p!=NULL)
 85     {
 86         cout<<p->val<<",";
 87         p=p->next;
 88     }
 89 }
 90 
 91 ListNode* GetNodePtr(ListNode* Head)
 92 {
 93     int count;
 94     ListNode* p;
 95     p=Head;
 96     cout<<"Please input the Node Order you want to delete: ";
 97     cin>>count;
 98     int i=0;
 99     while(i<count-1)
100     {
101         p=p->next;
102         i++;
103     }
104 
105     return p;
106 }
107 
108 
109 int main()
110 {
111     ListNode *Node;
112     head=CreateList();
113     cout<<"The list is: ";
114     PrintList(head);
115     cout<<endl;
116     Node=GetNodePtr(head);
117     deleteNode(Node);
118     cout<<"The delete node list is: ";
119     PrintList(head);
120     cout<<endl;
121     return 0;
122 } 

测试结果如下:

 

感谢@rainhard指出这个错误

转载于:https://www.cnblogs.com/vpoet/p/4671566.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么不能一次走遍哥尼斯堡的7座桥

全世界只有3.14 % 的人关注了爆炸吧知识数学的快乐到底有多简单今天&#xff0c;8岁表妹问了一个问题&#xff1a;看到这种类似11&#xff1f;的问题&#xff0c;超模君几乎不用思考就已经知道答案。但为了体现让表妹系统的理解知识&#xff0c;所以我决定......发生在哥尼斯堡…

官宣,11月8号,.NET6+64位VS璀璨面世!

12号&#xff0c;.NET6 RC2发布&#xff0c;13号&#xff0c;VS2022 RC版发布&#xff0c;11月8号&#xff0c;.NET6VS2022C#10 正式版将同时发布&#xff0c;.NET开发将步入全新篇章&#xff0c;各种新语法、新框架、新技术都如约而至&#xff0c;令人期待&#xff01;然而&am…

Python-技巧

0.推荐的扩展 requests urilib的替代品 BeautifulSoup4 解析HTML代码 rq 任务队列 selenium 自动化测试工具&#xff0c;模拟浏览器 1.sys.modules, 根据已加载的模块创建对象, 其中 page 为类名 if hasattr(sys.modules[__name__], page):setattr(self, page, getattr(sys.mod…

暴击!被初中生碾压智商!这份被国家数学集训队采用的初中奥数资料究竟有多厉害?...

全世界只有3.14 % 的人关注了爆炸吧知识提高版&#xff0c;来了&#xff01;这一份大部分人都没有见过的资料。它是我国出版的第一套数学竞赛的系列图书。前段时间&#xff0c;超模君给大家分享了这一系列的初中版奥数基础篇&#xff0c;得到了大家热烈的反响。于是&#xff0c…

COSCon21 开源文化 (GL) 论坛介绍

“ 点击蓝字 / 关注我们 ”| 作者、编辑&#xff1a;袁睿斌| 设计&#xff1a;朱亿钦、宋传琪第六届中国开源年会 (COSCon21) 将于 10月30-31日 由开源社举办。本次年会重新回归线下&#xff0c;让小伙伴们的面基成为了可能。届时&#xff0c;北京、上海、深圳、成都、珠海、大…

android wifi

<!-- 以下是使用wifi访问网络所需要的权限 --> <uses-permission android:name"android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name"android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:n…

1.5.2 在IIS上配置ASP.NET(转)

1.5.2 在IIS上配置ASP.NET 在服务器上部署ASP.NET网站时&#xff0c;需要.NET的运行环境.NET Framework。.NET Framework类似于Java的JDK&#xff0c;包含有.NET程序运行环境和命令行编译工具。如果服务器上没有安装.NET Framework&#xff0c;这就需要从微软网站下载&#xf…

51单片机外部地址c语言,cx51与c语言对单片机内部和外部资源变量和地址的定义是否兼容?为什么...

span namewhlm idwhlm原因:classpath没有设置好系统变量->新建->变量名&#xff1a;CLASSPATH 变量值&#xff1a;.;%JAVA_HOME%\lib(CLASSPATH中有一英文句号“.”后跟一个分号&#xff0c;表示当前路径的意思)在Classpath里面你可以直接指定一个包名&#xff0c;比如你…

你和女朋友的婚后老年生活!

1 厉害了&#xff0c;连扇子都是爱你的形状~2 一个漂亮的后空翻3 长得大了不起啊&#xff01;4 哈哈哈哈哈哈哈是这样5 哈哈哈哈哈防不胜防&#xff01;6 教科书般的标准答案你点的每个赞&#xff0c;我都认真当成了喜欢

实现一个基于 IConfiguration 的低配版 FeatureFlag

实现一个基于 IConfiguration 的低配版 FeatureFlagIntro在我们的应用中&#xff0c;可能有一些配置开关的需求&#xff0c;某些功能是否启用使用一个配置开关&#xff0c;用的时候就打开&#xff0c;不用的时候就关掉&#xff0c;于是基于 .NET Core 的里配置体系写了一个简单…

slider节点透明背景_【Cocos Creator 实战教程(1)】——人机对战五子棋(节点事件相关)...

一、涉及知识点场景切换按钮事件监听节点事件监听节点数组循环中闭包的应用动态更换sprite图片定时器预制资源二、步骤2.1 准备工作首先&#xff0c;我们要新建一个空白工程&#xff0c;并在资源管理器中新建几个文件夹​在这些文件夹中&#xff0c;我们用来存放不同的资源&…

《奠基计算机网络》清华大学出版社 之 IPv6和IPv4共存技术

2011年8月 ISATAP隧道 ISATAP &#xff08; Intra-Site Automatic Tunnel Addressing Protocol&#xff0c;站间自动隧道寻址协议&#xff09;是一种地址分配和主机到主机、主机到路由器和路由器到主机的自动隧道技术.它为IPv6主机之间提供了跨越IPv4内部网络的单播IPv6连通性。…

霍金竟然亲口承认自己是个赌徒!明明失败了不止一次,“菜鸡”却成了神话!...

全世界只有3.14 % 的人关注了爆炸吧知识科学“赌徒”在线发牌 一直以来他像一个深渊的幽灵&#xff0c;似乎无处不在他影响了无数的天体&#xff0c;却又无影无踪他永远只停留在人们的推断真实的图像&#xff0c;交错的数据他究竟是神仙的化身&#xff0c;还是地狱的使者没人…

小波变换原理_小波变换的知识,转载的

一、绘制原理&#xff1a;需要用到的小波工具箱中的三个函数cwt()&#xff0c;centfrq()&#xff0c;scal2frq()。具体参数及用途介绍如下&#xff1a;&#xff08;1&#xff09;COEFS cwt(S,SCALES,wname)该函数实现连续小波变换&#xff0c;其中S为输入信号&#xff0c;SCAL…

不让伤害再次发生

不让伤害再次发生我是英特尔成都工厂的第二批员工,在上海工厂学习培训之后,于2005 年加入到成都封装测试工厂的启动和生产工作中,到2010 年,我已经在成都工厂工作了五年半。在这五年半时间里,我始终在封装工程部任工程师,负责站点的设备、工艺和质量,确保站点按照相关计划和流程…

撩妹学会这一招,就没有人能拒绝你!

1 为了恋爱学会了 PS&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 二十不惑&#xff0c;手很迷惑▼3 怀疑家里的猫是「人变的」&#xff08;via.七七和铲屎官&#xff09;▼4 云南人有多喜欢吃菌子&#xff08;via.车夫&#xff09;&#xff08;请勿模仿&…

Javascript:阻止浏览器默认右键事件,并显示定制内容

在逛一些知名图片社区的时候&#xff0c;遇到自己心怡的图片&#xff0c;想要右键另存的时候&#xff0c;默认的浏览器菜单不见了&#xff0c;却出现了如&#xff1a;[©kevin版权所有]之类的信息&#xff1b; 今天在看Javascript事件默认行为相关的知识&#xff0c;所以&a…

Dapr + .NET 实战(十三)跨语言开发

欢迎大家参加4小时Dapr.NET 5的实战课程课程链接 https://ke.qq.com/course/4000292?tuin1271860f因为基于Dapr的服务架构是不限语言的&#xff0c;我们来看看Dapr的跨语言开发。我们使用golang&#xff0c;python&#xff0c;.NET来实现跨语言的服务调用&#xff0c;拓扑…

飞机上的排泄物都去哪里了?直接冲下来?

全世界只有3.14 % 的人关注了爆炸吧知识火车想必大家都知道&#xff0c;上完厕所&#xff0c;来也冲冲&#xff0c;去也冲冲&#xff0c;直接拥抱大地&#xff01;所以进站都会锁厕所门~那么飞机上也是这样吗&#xff1f;飞机上早期的厕所 早期&#xff0c;飞机上的马桶和普通…

.NET 基金会项目介绍 - ReactiveUI

ReactiveUI 是属于 .Net 基金会的一个项目&#xff0c;本文将简要介绍该项目相关的信息。中文介绍中文介绍内容翻译自英文介绍&#xff0c;主要采用意译、如与原文存在出入&#xff0c;请以原文为准。ReactiveUIReactiveUI 是一个可用于所有 .Net 平台的可组合的 MVVM 框架&…