#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. Go条件语句、switch和循环语句

    一:Go条件语句 package main import "fmt" //========go条件判断语句=== func main() { { fmt.Println(" ...

  2. linux umask使用方法

    A 什么是umask?   当我们登录系统之后创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?这就是umask干的事情.umask设置了用户创建文件的默认 权限,它与chmod的效果刚好相 ...

  3. bzoj4326 树链剖分 + 线段树 // 二分 lca + 树上差分

    https://www.lydsy.com/JudgeOnline/problem.php?id=4326 题意:N个点的树上给M条树链,问去掉一条边的权值之后所有树链长度和的最大值最小是多少. 首先 ...

  4. CodeForces1051F LCA + Floyd

    题意:给定一个10W的无向联通图,和10W的询问,每个询问求任意两点间的距离,限制条件是边数-点数不超过20 一般来说图上任意两点间的距离都会采用Floyd算法直接做,但是这个数据范围显然是不合理的, ...

  5. python对象继承

    继承允许我们在两个或者更多的类之间创建一种“是一个”的关系,这种关系把共同的细节抽象到一个超类里. 从技术上讲,每一个我们创建的类都使用了继承,所有的python类都是一个叫做object的特殊类的子 ...

  6. zTree基础

    zTree使用 zTree 是一个依靠 jQuery 实现的多功能 “树插件”, 而且拥有较好的浏览器兼容性,有着丰富的功能以及可以自定义样式,足以满足大部分业务的开发. 第一步先导入css及js文件 ...

  7. python机器学习-sklearn挖掘乳腺癌细胞(一)

    python机器学习-sklearn挖掘乳腺癌细胞( 博主亲自录制) 网易云观看地址 https://study.163.com/course/introduction.htm?courseId=10 ...

  8. Hbase学习01

    1.1  快速介绍 1.1.1 快速入门,单节点Hbase 本小节介绍单节点独立HBase的设置. 独立实例包含所有HBase守护进程 - Master,RegionServers和ZooKeeper ...

  9. Dubbo服务启动脚本

    ## /usr/wangfajun/service/user #!/bin/sh ## java env export JAVA_HOME=/usr/java/jdk1..0_79 export JR ...

  10. jQuery使用(四):DOM操作之查找兄弟元素和父级元素

    查找兄弟元素 向下查找兄弟元素 next() nextAll() nextUntil() 向上查找兄弟元素 prev() prevAll() prevUntil() 查找所有兄弟元素 siblings ...