剑指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,一经查实,立即删除!

相关文章

c语言程序stm8s,stm8s的c语言编程例程

stm8s的c语言编程例程实例一&#xff1a;控制灯的亮灭(或者蜂鸣器响&#xff0c;只要连接相应端口就可以了)&#xff1a;#i nclude "stm8s.h"〃头文件#defi ne ulong un sig ned long///void delay( ulong i){ulo ng j;for(j0;j{&#xff1b;}} 延时函数void mai n( …

python画图比赛_Python选修课第二届Turtle绘图大赛

20181101173,荀梓恒20181101197,叶普旭代码如下&#xff1a;import turtle as tt.setup(width0.5, height0.75, startxNone, startyNone)t.hideturtle()t.speed(10)t.pensize(2)t.penup()t.goto(100,200)t.pendown()t.setheading(90)t.begin_fill()t.colormode(255)t.fillcolor…

为什么不能一次走遍哥尼斯堡的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…

IUnknown接口QueryInterface函数介绍

一、COM组件的目标&#xff1a; COM组件的一个主要优势是&#xff1a;便于升级。 要实现这个优势需要满足一下两个条件&#xff1a; 1、运行时从客户程序动态加载和卸载&#xff0c;采用DLL技术可以实现。 2、为了更好的突出DLL的优势&#xff0c;还需要信息隐藏&#xff0c;即…

stc单片机c语言 pdf,STC单片机C语言程序设计 第13章 STC单片机C语言指针.pdf

STC单片机C语言指针主讲&#xff1a;何宾Email &#xff1a;hebinmail.buct.edu.cn2016.03C51编译器中指针的分类Cx51编译器支持使用字符“*”声明变量指针。C51编译器可以执行在标准C中所提供的所有操作。但是&#xff0c;由于8051独一无二的结构以及特点&#xff0c;C51编译器…

小猿学python_小猿圈python入门之转行零基础该如何学Python?

转行零基础学Python编程开发难度大吗&#xff1f;从哪学起&#xff1f;近期很多小伙伴问我&#xff0c;如果自己转行学习Python&#xff0c;完全0基础能否学会呢&#xff1f;Python的难度到底有多大&#xff1f;今天&#xff0c;小编就来为大家解决一下疑惑。学习Python难吗&am…

dojo Quick Start/dojo入门手册--json

那要是我想更换获取到的数据类型&#xff0c;比如json&#xff1f;xml&#xff1f;修改handleAs即可&#xff0c;如&#xff1a; handleAs: "json" dojo.xhrGet({ url: "http://localhost/hello/sayHello.jsp", handleAs: "json", load…

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;北京、上海、深圳、成都、珠海、大…

pythonopencv显示图像_OpenCV-Python 读取显示图像 | 五

目标在这里&#xff0c;你将学习如何读取图像&#xff0c;如何显示图像以及如何将其保存回去你将学习以下功能&#xff1a;cv.imread()&#xff0c;cv.imshow()&#xff0c;cv.imwrite()(可选)你将学习如何使用Matplotlib显示图像使用OpenCV读取图像使用cv.imread()函数读取图像…

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;比如你…

Resin的安全性ip限制

转载自resin的log、安全性ip限制、内存jvm、keepalive、代码的更新检测等在webapp标签下&#xff0c;可以有很多种安全性配置&#xff0c;下面介绍ip限制、用户米密码限制两种。ip限制在正常访问的web-app标签下&#xff0c;增加一个security-constrain标签即可&#xff0c;如下…

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

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

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

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

矩阵键盘逐行扫描C语言,(原创)51单片机C语言程序设计--速学教程实例(入门篇)之矩阵键盘(逐行扫描法).pdf...

(原创)51单片机C语言程序设计--速学教程实例(入门篇)之矩阵键盘(逐行扫描法).pdf/******************************************************************//* 名称&#xff1a;矩阵键盘逐行扫描法 *//* 作者&#xff1a;苏涛 *//* 时间&#xff1a;2011-01-15 *//* 单位&#xf…

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

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