单链表的创建,查找,删除,顺序打印,倒序打印(剑指offer)
来源:互联网 发布:怎么注册淘宝支付宝 编辑:程序博客网 时间:2024/06/10 04:33
单链表的创建,查找元素,删除元素,顺序打印单链表元素,逆序(倒序)打印单链表元素。
#include <cassert>#include <iostream>//默认不使用栈实现反序打印链表中的元素#define USE_STACK 0#if USE_STACK#include <stack>#endifstruct ListNode{ int mVal; ListNode* mpNext;};/***@pHead 使用指针的指针,使得函数结束后pHead指向的节点有效*@val 待插入的值*/void addNodeToTail(ListNode** pHead, int val){ ListNode* pNewNode = new ListNode; pNewNode->mVal = val; pNewNode->mpNext = nullptr; //如果头节点为空 if (*pHead == nullptr) { *pHead = pNewNode; } else { ListNode* pNode = *pHead; while (pNode->mpNext != nullptr) pNode = pNode->mpNext; pNode->mpNext = pNewNode; }}void destroyList(ListNode** pHead){ std::cout << "\nstart free memery..." << std::endl; ListNode* pNode = *pHead; while (*pHead != nullptr) { *pHead = (*pHead)->mpNext; delete pNode; pNode = *pHead; } std::cout << "free memery complete" << std::endl;}//从头到尾打印链表void printList(ListNode**pHead){ ListNode *pNode =*pHead; while (pNode != nullptr) { std::cout << pNode->mVal << " "; pNode = pNode->mpNext; }}//从尾到头打印链表,使用递归实现且不该变原列表的结构void printReverseList(ListNode* pHead){ if (pHead != nullptr) { if (pHead->mpNext != nullptr) { printReverseList(pHead->mpNext); } std::cout << pHead->mVal << "\t"; }}#if USE_STACKvoid printReverseList_stack(ListNode* pHead){ std::stack<ListNode*> nodes; ListNode* pNode = pHead; while (pNode != nullptr) { nodes.push(pNode); pNode = pNode->mpNext; } while (!nodes.empty()) { pNode = nodes.top(); std::cout << pNode->mVal << "\t"; nodes.pop(); }}#endifbool findVal(ListNode** pHead, int val){ ListNode* pNode = *pHead; while(pNode != nullptr && pNode->mVal != val) { pNode = pNode->mpNext; } return pNode == nullptr ? false : true;}/**作用: 删除指定元素为val的节点*@pHead 指向头指针*@val 指定元素为val*/void removeNode(ListNode**pHead, int val) { if (*pHead == nullptr) return; //将要被删除的节点 ListNode* pToBeDeleted = nullptr; //若删除的节点是头节点 if ((*pHead)->mVal == val) { pToBeDeleted = *pHead; *pHead = nullptr; } else { ListNode* pNode = *pHead; //查找要删除的元素,while结束时返回要查找节点的前一个节点 while (pNode->mpNext != nullptr && pNode->mpNext->mVal != val) { pNode = pNode->mpNext; } //找到要删除的节点 if (pNode->mpNext != nullptr && pNode->mpNext->mVal == val) { pToBeDeleted = pNode->mpNext; //指向要删除节点的下一个节点 pNode->mpNext = pNode->mpNext->mpNext; } } if (pToBeDeleted != nullptr) { delete pToBeDeleted; pToBeDeleted = nullptr; }}int main(int argc, char* argv[]){ ListNode* pHead = nullptr; int val; //val == 0为结束标志 while (std::cin >> val && val != 0) addNodeToTail(&pHead, val); std::cout << "打印初始化链表:"; printList(&pHead);#if USE_STACK printReverseList_stack(pHead);#endif /* std::cout << "\n反序打印链表: "; printReverseList(pHead); std::cout << "\n"; printList(&pHead); std::cout << std::endl;*//* std::cout << "\n请输入要查找的元素: "; int find_val; while (std::cin >> find_val && find_val != 0) { if (findVal(&pHead, find_val)) std::cout << "存在该元素" << std::endl; else std::cout << "不存在该元素" << std::endl; std::cout << "请输入要查找的元素: "; } std::cout << "\n请输入要删除的节点: "; int remove_val; while (std::cin >> remove_val && remove_val != 0) { removeNode(&pHead, remove_val); std::cout << "删除后的节点序列为 : " << std::endl; printList(&pHead); std::cout << "\n请输入要删除的节点: "; } */ //释放申请的内存空间 destroyList(&pHead); return 0;}
阅读全文
0 0
- 单链表的创建,查找,删除,顺序打印,倒序打印(剑指offer)
- 剑指offer-倒序打印链表
- java实现顺序表的增加,删除,查找,打印
- 单向链表的创建、查找、删除、打印
- 倒序打印一个单链表
- 倒序打印单链表
- 单链表的创建、删除与打印
- 单链表的创建,删除,插入以及打印。
- 带头节点链表的操作(链表的创建、删除、查找、逆转、打印等等)
- 单链表的创建,表长,插入,查找,逆置,中间元素,删除节点,打印
- 剑指offer(56)-按之字形顺序打印二叉树
- 剑指offer 编程题(18):顺序打印矩阵
- C++单链表的操作(创建,删除,打印,遍历,插入)
- 数据结构:单链表(一)的创建、插入、删除、遍历,打印
- 单链表详解(创建,插入,删除,打印)
- js打印顺序和倒序乘法口诀
- 按之字形顺序打印二叉树(剑指offer+队栈的应用)
- 链表的倒序打印
- java发送邮件
- [操作系统] 调度
- 描述一下JVM加载class文件的原理机制?
- Error creating bean with name 'multipartResolver': Failed to introspect bean class [org.springframew
- 【MySQL性能分析(1)】processlist命令详细
- 单链表的创建,查找,删除,顺序打印,倒序打印(剑指offer)
- 当我new class的时候,提示以下错误: Unable to parse template "Class" Error message: This template did not produce
- 【离散数学】1.2特殊集合与集合间关系
- spring学习总结(三)
- html meta标签大全
- LeetCode--Largest Number(最大数字)Python
- 蓝桥杯 算法训练 连续正整数的和
- String
- Android方法数统计