#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. opencv源码学习: getGaussianKernel( 高斯核);

    参考: https://blog.csdn.net/u012633319/article/details/80921023 二维高斯核, 可以根据下面的公式推到为两个一维高斯核的乘积: 原型: /** ...

  2. SSH框架学习环境配置

    1.      java环境 安装 安装jdk7,根据自己的操作系统选择32位或64位安装. 配置 安装后需要配置环境变量,如下所示: 配置classpath,如下: 并在path中添加java6安装 ...

  3. 你一直在找的 Mac 系统优化工具,可能就是这一款!

    文章来源:知乎 文章收录于:风云社区 www.scoee.com,提供上千款各类mac软件下载 尽管 Mac 上的维护工具总会被人诟病(通常是那些极客),但对于普通用户来说,像 CleanMyMac. ...

  4. JavaScript时间日期函数

    //随机数生成器Math.random() 装换为整数parseInt() 日期时间函数(需要用变量调用):var b = new Date(); //获取当前时间b.getTime() //获取时间 ...

  5. Hadoop端口说明

    Hadoop端口说明: 默认端口                            设置位置                                    描述信息 8020        ...

  6. springboot 日志【转】【补】

    市面上的日志框架 日志门面 (日志的抽象层) 日志实现 JCL(Jakarta Commons Logging)(2014) SLF4j(Simple Logging Facade for Java) ...

  7. HDU - 6394 Tree(树分块+倍增)

    http://acm.hdu.edu.cn/showproblem.php?pid=6394 题意 给出一棵树,然后每个节点有一个权值,代表这个点可以往上面跳多远,问最少需要多少次可以跳出这颗树 分析 ...

  8. ArcGis Python脚本——批量添加字段

    先看如何增加一个字段 函数:arcpy.AddField_management 语法:AddFields_management (in_table, field_description) 参数 说明 ...

  9. 使用 CROSS APPLY 与 OUTER APPLY 连接查询

    Ø  前言 日常开发中遇到多表查询时,首先会想到 INNER JOIN 或 LEFT OUTER JOIN 等等,但是这两种查询有时候不能满足需求.比如,左表一条关联右表多条记录时,我需要控制右表的某 ...

  10. C# FTPHelper工具类

    /// <summary> /// Ftp /// </summary> public class FtpFileOperation { private string _ftp ...