#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++的更多相关文章

  1. Java BAT大型公司面试必考技能视频-1.HashMap源码分析与实现

    视频通过以下四个方面介绍了HASHMAP的内容 一. 什么是HashMap Hash散列将一个任意的长度通过某种算法(Hash函数算法)转换成一个固定的值. MAP:地图 x,y 存储 总结:通过HA ...

  2. MySQL面试必考知识点:揭秘亿级高并发数据库调优与最佳实践法则

    做业务,要懂基本的SQL语句: 做性能优化,要懂索引,懂引擎: 做分库分表,要懂主从,懂读写分离... 数据库的使用,是开发人员的基本功,对它掌握越清晰越深入,你能做的事情就越多. 今天我们用10分钟 ...

  3. 95%的技术面试必考的JVM知识点都在这,另附加分思路!

    概述:知识点汇总 jvm的知识点汇总共6个大方向:内存模型.类加载机制.GC垃圾回收是比较重点的内容.性能调优部分偏重实际应用,重点突出实践能力.编译器优化和执行模式部分偏重理论基础,主要掌握知识点. ...

  4. js面试必考:this

    this是前端面试中必考的基础知识点,也是新手小白在做项目中经常晕头转向的问题.但其实this不难理解. 判断this指向时,记住以下几点: 判断函数类型, 1.1 如果是箭头函数,则为第一个包裹箭头 ...

  5. 【面试题】100IT名企java面试必考面试题

    一.Java 基础部分 1.   JAVA 的基本数据类型有哪些 ?   String 是不是基本数据类型 ? Java  有 8 种基本数据类型:           byte    int     ...

  6. 五分钟学Java:如何学习Java面试必考的JVM虚拟机

    原创声明 本文首发于微信公众号[程序员黄小斜] 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 为什么要学习JVM虚拟机 最近的你有没有参加Java面试呢?你有没有发现,Java ...

  7. 五分钟学Java:如何学习Java面试必考的网络编程

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 简介 Java作为一门后端语言,对于网络编程的支持是必不可少的,但是,作为一个经常CRUD的Java工程师,很多时候都不 ...

  8. 深入解读大厂java面试必考基本功-HashMap集合

    课程简介 HashMap集合在企业开发中是必用的集合同时也是面试官面试率很高的集合,因为HashMap里面涉及了很多的知识点,可以比较全面考察面试者的基本功,想要拿到一个好offer,这是一个迈不过的 ...

  9. 【iOS开发-33】学习手动内存管理临时抛弃ARC以及retain/assign知识——iOSproject师面试必考内容

    我们为什么须要内存管理?当使用内存达到40M和45M时候会发出警告,假设不处理,占用内存达到120M时直接强制关闭程序. 所以出现闪退除了是程序出现逻辑错误,还有可能是内存使用过大. (1)创建一个对 ...

随机推荐

  1. qml: 支持的基本类型

    qml支持的基本类型有: bool unsigned int, int; float    double   qreal QString QUrl QColor QData,  QTime  QDat ...

  2. python自动化开发-[第三天]-编码,函数,文件操作

    今日概要 - 编码详解 - 文件操作 - 初识函数 一.字符编码 1.代码执行过程 代码-->解释器翻译-->机器码-->执行 2.ASCII ASCII:一个Bytes代表一个字符 ...

  3. bzoj1003 最短路+dp

    遇到小范围数据的题目就容易被限制了思维,我单知道数据小可以跑很多遍最短路,但我没想到暴力跑N ^ 2的最短路也能过 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输 ...

  4. data_type

    import logging logger = logging.getLogger("simple_example") logger.setLevel(logging.DEBUG) ...

  5. 剑指Offer_编程题_13

    题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. class So ...

  6. HDFS集群优化篇

    HDFS集群优化篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.操作系统级别优化 1>.优化文件系统(推荐使用EXT4和XFS文件系统,相比较而言,更推荐后者,因为XF ...

  7. 开源实时消息推送系统 MPush

    系统介绍 mpush,是一款开源的实时消息推送系统,采用java语言开发,服务端采用模块化设计,具有协议简洁,传输安全,接口流畅,实时高效,扩展性强,可配置化,部署方便,监控完善等特点.同时也是少有的 ...

  8. Sqlserver中的视图

    一.视图的基本知识 什么是视图:视图是从一个或多个表导出的虚拟的表,具有普通表的结构,物理上是不存在的.视图是动态的数据的集合,数据是随着基表的更新而更新. 视图的优点: ①在多表查询时,查询方便. ...

  9. Vue项目搭建

    1.环境搭建 安装node 官网下载安装包,傻瓜式安装:https://nodejs.org/zh-cn/ 安装cnpm npm install -g cnpm --registry=https:// ...

  10. eDEX-UI

    eDEX-UI A science fiction terminal emulator disigned for large touchscreen that runs on all major OS ...