剑指offer之C++语言实现链表(两种删除节点方式)

1 问题

用C++语言实现链表

 

 

 

 

 

2 代码实现

#include <iostream>
#include <stdlib.h>using namespace std;class List
{
public:List();~List();List* createNode(int value);//创建节点bool insertNode(List *node);//插入节点void printList();//打印节点bool deleteNode(List *node);//删除节点不移动头节点bool deleteNode1(List *node);//删除节点移动头节点int listSize();//长度void printNode();//打印但前的valuevoid freeList();//释放链表
private:int value;List *head;List *next;
};bool List::deleteNode(List *node)
{if (node == NULL){std:cout << "node is NULL" << std::endl;	return false;}if (head == NULL){std::cout << "head is NULL" << std::endl;	return false;}//如果node等于headif (head == node){head = head->next;}List *p = head;while (p->next != NULL){if (p->next == node){p->next = p->next->next;return true;}p = p->next;}return false;	
}bool List::deleteNode1(List *node)
{if (node == NULL){std:cout << "node is NULL" << std::endl;	return false;}if (head == NULL){std::cout << "head is NULL" << std::endl;	return false;}//如果node等于headif (head == node){head = head->next;}List *p = head;while (head->next != NULL){if (head->next == node){head->next = head->next->next;std::cout << "delete node success head->value" << head->value << std::endl;//这里要记得把头节点的指针移动最后还原,这里的头节点是保存在这个类里面,改变了就是改变了//如果这里是把head作为参数传递,最后head会被销毁那么不需要移动头指针head = p;return true;}//注意,这里由于head是成员变量,改变了就是改变了,所以需要最后重新指定head = head->next;}std::cout << "delete node fail head->value" << head->value << std::endl;//这里要记得把头节点的指针移动最后还原,这里的头节点是保存在这个类里面,改变了就是改变了//如果这里是把head作为参数传递,最后head会被销毁那么不需要移动头指针head = p;return false;	
}List::List()
{value = 0;head = NULL;next = NULL;
}List::~List()
{delete head;delete next;
}List* List::createNode(int value)
{List *list = NULL;list = new List();if (list){list->value = value;return list;	}return NULL;
}bool List::insertNode(List *node)
{node->next = head;head = node;return true;	
}void List::printList()
{	if (head == NULL){std::cout << "head is NULL" << std::endl;return;}List *p = head;while (p != NULL){std::cout << p->value << std::endl;	p = p->next;}return;	
}void List::printNode()
{std::cout << value << std::endl;	
}int List::listSize()
{if (head == NULL){std::cout << "head is NULL" << std::endl;return 0;	}int len = 0;List *p = head;while (p != NULL){p = p->next;++len;}return len;
}void List::freeList()
{if (head == NULL){std::cout << "head is NULL" << std::endl;return;	}List *p;while (head != NULL){p = head;head = head->next;free(p);}
}int main()
{List list;List *list1 = list.createNode(5);list.insertNode(list1);List *list2 = list.createNode(6);list.insertNode(list2);List *list3 = list.createNode(1);list.insertNode(list3);List *list4 = list.createNode(3);list.insertNode(list4);List *list5 = list.createNode(2);list.insertNode(list5);list.printList();std::cout << "list size is " << list.listSize() << std::endl;std::cout << "-----------开始删除节点值为3的节点" << std::endl;list.deleteNode1(list4);list.printList();std::cout << "list size is " << list.listSize() << std::endl;list.freeList();list.printList();return 0;	
}

 

 

 

 

 

 

3 运行结果

2
3
1
6
5
list size is 5
-----------开始删除节点值为3的节点
delete node success head->value2
2
1
6
5
list size is 4
head is NULL

 

 

 

 

 

 

4 总结

很明显用C语言实现,我们习惯在外面搞个头结点,然后用C++实现,我们直接在类的里面放一个head指针,然后我们在增加节点的时候我们会把head进行移动,放在最前面,所以后面的 便利和删除操作等最好是不要动head的位置了,因为head动了,下次便利就有问题,如果删除函数移动了head,我们最后需要复原head

比如我们的头指针尽量不要移动,我们可以用一个指针变量来保存这个head指针,然后我们移动保存的指针变量,同时把保存的指针变量在一些情况下改变下一个指向的指针,那么我们下次便利head也是生效的,这样保证了头指针不被污染

比如下面的例子

 

#include <stdio.h>void change(char *a)
{*(a + 1) = 's';
}
int main()
{char value[10] = "chenyu";change(value);printf("value is %s\n", value);return 0;
}#include <stdio.h>void change(char *a)
{char *p = a;*(p + 1) = 's';
}
int main()
{char value[10] = "chenyu";change(value);printf("value is %s\n", value);return 0;
}

其实最后的结果都是一样,csenyu

头指针是指向这块内存的地址,如果我们用指针变量保存了,然后这个指针变量也指向了这里,用指针变量去操作后,然后头指针也是指向这里,后面数据的指向也会改变

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

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

相关文章

【C语言简单说】十九:二维数组循环嵌套(2)

这节直接用循环嵌套来输出二维数组了&#xff1a; 注&#xff1a;我说的队和列并不是一般说法&#xff0c;我用此比喻好让新手更好理解。 #include<stdio.h> #include<stdlib.h> int main() {int array[2][3]{1,2,3,4,5,6};//第一句 int i,j;//第二句 for(i0;i&l…

C# 11 对 ref 和 struct 的改进

前言C# 11 中即将到来一个可以让重视性能的开发者狂喜的重量级特性&#xff0c;这个特性主要是围绕着一个重要底层性能设施 ref 和 struct 的一系列改进。但是这部分的改进涉及的内容较多&#xff0c;不一定能在 .NET 7&#xff08;C# 11&#xff09;做完&#xff0c;因此部分内…

lia人是什么意思_狗狗喜欢舔人到底什么意思?毛孩的心思主人你要懂

很多人都喜欢养狗&#xff0c;因为它们忠诚、淘气、可爱。同时&#xff0c;狗狗也有很多奇怪的习惯&#xff0c;例如&#xff1a;喜欢舔人&#xff0c;喜欢追逐活动的东西等等。不过大多数狗主人通常都会有一个最想知道的问题&#xff1a;为什么狗狗总喜欢舔人&#xff0c;它们…

UINavigationController

-(void)resetTabbarController:(UITabBarController *)controller { NSArray *arr controller.tabBar.items; UITabBarItem *item0 [arr objectAtIndex:0]; //使用指定图片 [item0 setSelectedImage:[[UIImage imageNamed:"icon_everyday_press"] imageWithRenderi…

“爱思助手”曝为iOS木马:可绕过苹果DRM机制

一款新的iOS木马已在国内曝光&#xff0c;它可以通过PC感染未越狱的iOS设备&#xff0c;而无需利用企业证书。Palo Alto Networks指出&#xff0c;其名叫“爱思助手”(AceDeceiver)&#xff0c;目前正在影响我国的iOS用户。“爱思助手”利用了苹果数字版权管理(DRM)上的FairPla…

php自动生成mysql的触发代码。

php自动生成mysql的触发代码。 如果公司里有上百个表要做触发器&#xff0c;如果手动写代码的话。很累&#xff0c;所以今天写了一个小程序&#xff0c; <?php $dbname test;//数据库 $tab1 user; //执行的表 $tab2 user_bak; //被触发的表 $conn mysql_connect("…

C#趣味程序---求两个数的最大公约数和最小公倍数

using System;namespace ConsoleApplication1 {class Program{static void Main(string[] args){Console.WriteLine("请输入一个数&#xff1a;");int num1 int.Parse(Console.ReadLine());Console.WriteLine("请输入另一个数&#xff1a;");int num2 in…

php运行条件,PHP配置环境要求 php运行的先决条件

类型&#xff1a;编程相关大小&#xff1a;320KB语言&#xff1a;中文 评分&#xff1a;6.6标签&#xff1a;立即下载在本教程中&#xff0c;假设用户的服务器已经安装并运行了 PHP&#xff0c;所有以 .php 结尾的文件都将由 PHP 来处理。在大部分的服务器上&#xff0c;这是 P…

剑指offer之二维数组中查找

1 问题 二维数组中查找&#xff1a; 在一个二维数组钟&#xff0c;每一行都按照从左到右递增得顺序排列&#xff0c;每一列 都按照从上往下得递增排列&#xff0c;请完成一个函数&#xff0c;输入这样得一个二维数组和一个 整数&#xff0c;判断数组是否含有该整数 列如&…

【C语言简单说】二十:指针基础

。。据说指针很难 其实稍微理解概念不难。 先看百科的定义&#xff1a;在计算机科学中&#xff0c;指针&#xff08;Pointer&#xff09;是编程语言中的一个对象&#xff0c;利用地址&#xff0c;它的值直接指向&#xff08;points to&#xff09;存在电脑存储器中另一个地方的…

移动web开发(三)——字体使用

参考&#xff1a; 移动web页面使用字体的思考.http://www.cnblogs.com/PeunZhang/p/3592096.html

c#可变参数params的介绍

c#可变参数params的介绍作为一个netUp主&#xff0c;今天在b站刷到了java的一个视频&#xff0c;可变参数的介绍&#xff0c;所以今天给大家介绍一下c#中可变参数params的使用介绍&#xff0c;我们首先看一下官方解释: 使用 params 关键字可以指定采用数目可变的参数的params。…

Javascript中的循环变量声明,到底应该放在哪儿?

不放走任何一个细节。相信很多Javascript开发者都在声明循环变量时犹 豫过var i到底应该放在哪里&#xff1a;放在不同的位置会对程序的运行产生怎样的影响&#xff1f;哪一种方式符合Javascript的语言规范&#xff1f;哪一种方式和ecma标准未来的发展 方向匹配&#xff1f;本文…

Delphi全局热键的注册

1.在窗启动时创建ATOM;(aatom:ATOM;定义在private中&#xff09; 1 if FindAtom(ZWXhotKey)0 then 2 begin 3 aatom:GlobalAddAtom(ZWXhotKey); 4 end; 5 if RegisterHotKey(Handle,aatom,MOD_ALT,$41) then 6 begin 7 MessageBox(Handle,按alta,提示,MB_OK); 8 end; 2.定义处…

python爬取网易云音乐问题陈述_python 网易云音乐 评论爬取问题

除了使用phantomjs,selenium之外&#xff0c;怎么爬取多页评论&#xff0c;这两个都太慢了。例如http://music.163.com/#/song?i... 的 评论。webapi都是http://music.163.com/weapi/v1...&#xff0c;每页20个评论&#xff0c;怎么获取下一页的评论&#xff0c;param是加密的…

C#趣味程序----分数之和

问题:求这样的四个自然数p,q,r,s(p<=q<=r<=s),使得等式1/p + 1/q +1/r +1/s=1成立。 分析:将原式同分,化简整理后得到:2<=p<5,p<=q<7,q<r<13。 using System;namespace ConsoleApplication1 {class Program{static void Main(string[] ar…

php gearmanclient addoptions,gearman PHP7扩展安装

注&#xff1a;官方提供的只支持PHP 6&#xff0c;需要第3方支持&#xff0c;https://github.com/wcgallego/pecl-gearmanyum install libgearman-devel -y 如没装&#xff0c;则config时报错 error: Please install libgearmanwget https://github.com/wcgallego/pecl-gearm…

剑指offer之把字符串里面空格替换成百分之20

1 问题 把字符串里面空格替换成百分之20 2 代码实现 第一种时间复杂的o(n * n)实现 #include <stdio.h> #include <stdlib.h>char* insert(char *a, int len, char *replace, int replaceLen) {//先得到多少个空格char *p a;int count 0;while (*p ! \0){if (…

【C语言简单说】二十一:双重指针基础 (完结)

其实后面这两节我是用我几年前写的教程复制过来的。。。 ’ – ’ ) ( &#xff13; )╱~~ 如有错误&#xff0c;请留言提醒哈~~~尴尬的笑。 多重指针呢其实就是指向指针的指针。 首先&#xff0c;变量大家都知道是啥意思了吧&#xff1f;一个变量是有地址的。那么指针变量也是…

jquery设置滚动条距离页面顶部的高度

//获取滚动条到顶部的垂直高度 $(document).scrollTop(); //获取滚动条到左边的垂直宽度 $(document).scrollLeft(); function clickFn(){var topL0 $("#l0").offset().top;var topL1 $("#l1").offset().top;alert("l0距离顶部:"topL0)aler…