链表经典算法

链表经典算法

链表的插入,删除,修改,查找等经典算法,以及基本应用实例

#include <iostream> using namespace std; typedef int T; class List{ struct Node{ T data; Node* next; Node(const T& d=T()):data(d),next(0){}//零初始化  }; Node* head;//头指针,用来保存头节点的地址 int len; public: List():head(NULL),len(0){ } void push_front(const T& d){ //前插 insert(d,0); } List& push_back(const T& d){ //尾插  insert(d,size()); return *this; } int size()const{ return len; } Node*& getptr(int pos){ //找链表中指向指定位置的指针 if(pos<0||pos>size()) pos=0; if(pos==0) return head; Node* p = head; for(int i=1; i<pos; i++) p = p->next; return (*p).next; } void insert(const T& d, int pos){ //在任意位置插入 Node*& pn = getptr(pos); Node* p = new Node(d); p->next = pn; pn = p; ++len; } void travel()const{ //遍历 Node* p = head; while(p!=NULL){ cout << p->data << ' '; p = p->next; } cout << endl; } void clear(){ //清空这个链表 while(head!=NULL){ Node* p = head->next; // cout << "delete " << head << endl;  delete head; head = p; } len = 0; } ~List(){ // cout << this << "*******" << head << endl;  clear(); } void erase(int pos){ //有效位置为0~size()-1 if(pos<0||pos>=size()) return; Node*& pn = getptr(pos); Node* p = pn; pn = pn->next; delete p; --len; } void remove(const T& d){ int pos; while((pos=find(d))!=-1) erase(pos); } int find(const T& d)const{ int pos = 0; Node* p = head; while(p){ if(p->data==d) return pos; p = p->next; ++pos; } return -1; } void set(int pos, const T& d){ if(pos<0||pos>=size()) return; getptr(pos)->data = d; } bool empty()const{ return head==NULL;} T front()const{ if(empty())throw "";return head->data;} T back()const{ if(empty())throw ""; Node* p=head; while(p->next!=NULL) p = p->next; return p->data; } }; int main() { List l; l.push_front(5);//5 l.push_front(8);//8 5 l.push_front(20);//20 8 5 l.insert(9,2);//20 8 9 5 l.insert(6,100);//6 20 8 9 5 l.insert(7,-10);//7 6 20 8 9 5 l.insert(1,2);//7 6 1 20 8 9 5 l.push_back(10).push_back(15).travel(); l.erase(0);//x7:6 1 20 8 9 5 10 15 l.erase(l.size()-1);//x15:6 1 20 8 9 5 10 l.erase(2);//x20:6 1 8 9 5 10  l.travel(); l.push_back(6);//6 1 8 9 5 10 6 l.insert(6, 3);//6 1 8 6 9 5 10 6  l.travel(); l.remove(6);//1 8 9 5 10  l.travel(); l.set(0, 666); l.set(4, 789); l.set(l.find(9),123); l.set(1, 777); l.travel(); cout << l.front() << "..." << l.back() << ',' << l.size() << "" << endl; while(!l.empty()) l.erase(0); cout << "size:" << l.size() << endl; return 0; }

 

转载于:https://www.cnblogs.com/macong/archive/2012/11/11/2765240.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110286.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • PHP变量

    PHP变量

  • spring espect XX but YY

    spring espect XX but YY注入和查找问题HSFConsumerbean,注入的是beanName=’实际接口名’,type=’HSFSpringConsumerBean’,造成Autowire时查询出来的类型不匹配MybatisMapper的autowire为什么没有类型不匹配的问题,注入时是Mapper的代理类,查询出来却直接是Mapper实现类?@autowiredpr…

    2022年10月21日
  • scp命令传文件–远程ip加端口号的方式[通俗易懂]

    scp命令传文件–远程ip加端口号的方式[通俗易懂]scp命令传文件–远程ip加端口号的方式

  • pycharm运行文件_pycharm编译成exe

    pycharm运行文件_pycharm编译成exe一个项目开发完毕后总有一种想法,就是生成可执行文件,总不能一直用pythonxxx执行吧。以下操作同时适用于windows和Linux下的Pycharm(我在Ubuntu下试验过,生成的是在Ubuntu下的可执行文件)1、打开Pycharm。在pycharm中安装插件PyInstaller2、打开Terminal(快捷键Alt+F12)3、安装pyinstaller工具输入:pipinst…

  • nginx负载均衡并发量(应用服务器高并发解决方案)

    1.什么是负载均衡?当一台服务器的性能达到极限时,我们可以使用服务器集群来提高网站的整体性能。那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台后端服务器去处理。那么在这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡问题。下…

  • Kafka常见面试题

    1什么是kafkaKafka是分布式发布-订阅消息系统,它最初是由LinkedIn公司开发的,之后成为Apache项目的一部分,Kafka是一个分布式,可划分的,冗余备份的持久性的日志服务,它主要用于处理流式数据。2为什么要使用kafka,为什么要使用消息队列缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号