关于链表所有操作,面试必考C++
#include <iostream>
#include <stack>
using namespace std;
//链表的结构体
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
ListNode()
{
m_pNext = NULL;
}
};
//判断链表是否为空
bool isEmpty(ListNode* list)
{
return list->m_pNext == NULL;
}
//判断position是否是最后一个
bool isLast(ListNode* position, ListNode* list)
{
return position->m_pNext == NULL;
}
//在链表中找到某个元素
ListNode* Find(int value, ListNode* list)
{
ListNode* pNode = list->m_pNext;//指向第一个结点,list为头结点,不存放数据
while (pNode != NULL && pNode->m_nValue != value)
{
pNode = pNode->m_pNext;
}
return pNode;
}
//找到某一元素的前驱结点
ListNode* FindPrevious(int value, ListNode* list)
{
//指向第一个结点
ListNode* pNode = list;
while (pNode->m_pNext != NULL && pNode->m_pNext->m_nValue != value)
{
pNode = pNode->m_pNext;
}
return pNode;
}
//删除某个结点
void DeleteNode(int value, ListNode* list)
{
if (list == NULL)
{
return;
}
//要将删除的结点进行备份
ListNode* pDeleteNode = NULL;
ListNode* pNode = list;
while (pNode->m_pNext != NULL && pNode->m_pNext->m_nValue != value)
{
pNode = pNode->m_pNext;
}
if (pNode->m_pNext != NULL)
{
pDeleteNode = pNode->m_pNext;//待删除的结点
pNode->m_pNext = pDeleteNode->m_pNext;//待删除结点的下一个结点
//释放待删除的结点
delete pDeleteNode;
pDeleteNode = NULL;
}
return;
}
//将一个元素插入到pToBeInsertNode指示的结点之后,元素的值为value;
void InsertNode(int value, ListNode* list, ListNode* pToBeInsertNode)
{
if (list == NULL || pToBeInsertNode == NULL)
{
return;
}
ListNode* pNewNode = new ListNode();
if (pNewNode == NULL)
{
return;
}
pNewNode->m_nValue = value;
pNewNode->m_pNext = pToBeInsertNode->m_pNext;
pToBeInsertNode->m_pNext = pNewNode;
} //在末尾添加元素
void AddToTail( ListNode* list, int value)
{
//建立一个新节点
ListNode* pNewNode = new ListNode();
if (pNewNode == NULL)
{
return;
}
pNewNode->m_nValue = value;
pNewNode->m_pNext = NULL;
if (list == NULL)
{
list = pNewNode;
}
else
{
ListNode* tmpNode = list;
while (tmpNode->m_pNext != NULL)
{
tmpNode = tmpNode->m_pNext;
}
tmpNode->m_pNext = pNewNode;//最后一个的下一个结点指向新节点
}
}
//删除整个链表
void DeleteList(ListNode*list) {
if (list == NULL)
{
return;
}
ListNode*pNode = list->m_pNext;
ListNode*pTemp = NULL; list->m_pNext = NULL; //断开头结点
while (pNode != NULL)
{
pTemp = pNode->m_pNext;//需要保存其下一个节点
delete pNode;
pNode = pTemp; //移到下一个节点
}
} //打印链表
void printList(ListNode* list)
{
if (list == NULL)
{
return;
}
ListNode* pNode = list->m_pNext;
while (pNode != NULL)
{
cout << pNode->m_nValue << " ";
pNode = pNode->m_pNext;
}
cout << endl;
}
//逆序打印链表
void printListReversingly(ListNode* list)
{
stack<ListNode*> nodes;
ListNode* pNode = list->m_pNext;
while (pNode != NULL)
{
nodes.push(pNode);//压栈
pNode = pNode->m_pNext;
}
while (!nodes.empty())
{
ListNode* pTmp = nodes.top();//获取顶端元素
cout << pTmp->m_nValue << " ";
nodes.pop();//弹出
}
cout << endl;
}
//判断一个链表是否有环
bool LinkListLoop(ListNode* pHead)
{
ListNode* p = pHead;
ListNode* q = pHead;
while (p != NULL && q != NULL)
{
p = p->m_pNext;//p走一步;
q = q->m_pNext;
if (q->m_pNext != NULL)
q = q->m_pNext;//q走两步;
if (p != NULL && p == q)
{
return true;
}
}
return false;
}
//测试
int main() {
ListNode* list = new ListNode();
for (int i = ; i < ; i++)
{
AddToTail(list, i);
}
cout << "打印链表:" << endl;
printList(list); cout << "逆序打印链表:" << endl;
printListReversingly(list); cout << "在末尾添加元素:10" << endl;
AddToTail(list, );
printList(list); cout << "移除节点值为5的节点:" << endl;
DeleteNode(, list);
printList(list); cout << "找到节点值为6的节点的前驱节点:" << endl;
ListNode* pNode = FindPrevious(, list);
cout << pNode->m_nValue << endl; cout << "删除链表:" << endl;
DeleteList(list);
printList(list); cout << "链表是否为空:" << endl;
cout << isEmpty(list) << endl;
system("pause");
return ;
}
关于链表所有操作,面试必考C++的更多相关文章
- Java BAT大型公司面试必考技能视频-1.HashMap源码分析与实现
视频通过以下四个方面介绍了HASHMAP的内容 一. 什么是HashMap Hash散列将一个任意的长度通过某种算法(Hash函数算法)转换成一个固定的值. MAP:地图 x,y 存储 总结:通过HA ...
- MySQL面试必考知识点:揭秘亿级高并发数据库调优与最佳实践法则
做业务,要懂基本的SQL语句: 做性能优化,要懂索引,懂引擎: 做分库分表,要懂主从,懂读写分离... 数据库的使用,是开发人员的基本功,对它掌握越清晰越深入,你能做的事情就越多. 今天我们用10分钟 ...
- 95%的技术面试必考的JVM知识点都在这,另附加分思路!
概述:知识点汇总 jvm的知识点汇总共6个大方向:内存模型.类加载机制.GC垃圾回收是比较重点的内容.性能调优部分偏重实际应用,重点突出实践能力.编译器优化和执行模式部分偏重理论基础,主要掌握知识点. ...
- js面试必考:this
this是前端面试中必考的基础知识点,也是新手小白在做项目中经常晕头转向的问题.但其实this不难理解. 判断this指向时,记住以下几点: 判断函数类型, 1.1 如果是箭头函数,则为第一个包裹箭头 ...
- 【面试题】100IT名企java面试必考面试题
一.Java 基础部分 1. JAVA 的基本数据类型有哪些 ? String 是不是基本数据类型 ? Java 有 8 种基本数据类型: byte int ...
- 五分钟学Java:如何学习Java面试必考的JVM虚拟机
原创声明 本文首发于微信公众号[程序员黄小斜] 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 为什么要学习JVM虚拟机 最近的你有没有参加Java面试呢?你有没有发现,Java ...
- 五分钟学Java:如何学习Java面试必考的网络编程
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 简介 Java作为一门后端语言,对于网络编程的支持是必不可少的,但是,作为一个经常CRUD的Java工程师,很多时候都不 ...
- 深入解读大厂java面试必考基本功-HashMap集合
课程简介 HashMap集合在企业开发中是必用的集合同时也是面试官面试率很高的集合,因为HashMap里面涉及了很多的知识点,可以比较全面考察面试者的基本功,想要拿到一个好offer,这是一个迈不过的 ...
- 【iOS开发-33】学习手动内存管理临时抛弃ARC以及retain/assign知识——iOSproject师面试必考内容
我们为什么须要内存管理?当使用内存达到40M和45M时候会发出警告,假设不处理,占用内存达到120M时直接强制关闭程序. 所以出现闪退除了是程序出现逻辑错误,还有可能是内存使用过大. (1)创建一个对 ...
随机推荐
- cookie猜数字游戏(上)---------------思路分析(踩坑)
说明:用户第一次请求页面的时候,同时会产生一个随机数,用户点提交表单的时候,会将输入的数字与第一次请求产生的数字进行一个对比. 问题一:如何保存用户每次提交的数据 我们常见的在服务器中保存数据的方式是 ...
- 降维方法PCA与SVD的联系与区别
在遇到维度灾难的时候,作为数据处理者们最先想到的降维方法一定是SVD(奇异值分解)和PCA(主成分分析). 两者的原理在各种算法和机器学习的书籍中都有介绍,两者之间也有着某种千丝万缕的联系.本文在简单 ...
- 剑指Offer_编程题_9
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. class Solution { public: int jumpFloorI ...
- KVM安装启动虚拟机
KVM定制OpenStack云主机 如何定制化OpenStack云主机?从去年10月份刚开始接触OpenStack,到现在也有一年了.虽说目前只是停留在用它,对它的一些组件简单的了解,但谈到制作出一个 ...
- win10 同步批处理禁用和启用网卡
@ echo off echo 正在启用超级管理员权限... %1 %2 ver|find "5.">nul&&goto :st mshta vbscript ...
- Java并发注解Annotation
Java并发编程中,用到了一些专门为并发编程准备的 Annotation. 主要包括三类: 1.类 Annotation(注解) 就像名字一样,这些注解是针对类的.主有要以下三个: @Immutabl ...
- windows系统下mysql-8.0.13-winx64(zip安装)
一.下载地址: http://mirrors.163.com/mysql/Downloads/MySQL-8.0/mysql-8.0.13-winx64.zip 二.安装: 1.解压: mysql根路 ...
- [时序图笔记] 步步为营UML建模系列五、时序图(Squence diagram)【转】
概述 顺序图是一种详细表示对象之间以及对象与参与者实例之间交互的图,它由一组协作的对象(或参与者实例)以及它们之间可发送的消息组成,它强调消息之间的顺序. 顺序图是一种详细表示对象之间以及对象与系统外 ...
- golang byte与rune区别
先看代码 package main import ( "fmt" ) func main() { var a = "hello world" var b = & ...
- SpringBoot系列: SpringBoot 启动慢的问题
SpringBoot 应用启动速度往往很快, 但在某些Linux 服务器上可能会很慢, 可能超过1分钟, 有时候甚至启动不起来. 下面过程耗时太长:IdGeneratorBase: Creation ...