c++ 链表操作:添加、遍历、删除、查找
来源:互联网 发布:什么是node服务器 编辑:程序博客网 时间:2024/06/05 20:25
链表是一种动态数据结构,因为在创建链表的时候,无需知道链表的长度。链表的每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
struct node{int value;node* next;};
当插入一个结点的时候,我们只需要为新结点分配内存,然后调节结点的指针指向,新结点就被(逻辑上)链接到链表里。
/* 链表尾加入新元素*/node* addNode(node*head ,int addValue){ node* newNode=new node(); newNode->next=NULL; newNode->value=addValue; node* p=new node(); p=head; //list的头结点 if(head==NULL) { head=newNode; //新节点为链表头节点 }else {while(p->next!=NULL)//找到尾节点p=p->next;p->next=newNode; //在尾节点后面加入新节点 } return head;}
由于链表中的内存不是一次性连续分配的,因此我们无法保证链表的内存和数组一样是连续的。因此想在链表中找到它的某一个结点,我们只能从头结点开始,沿着指向下一个结点的指针遍历链表,它的时间效率为O(n)。
/*在链表中找到某个值,删除它*/node* removeNode(node* head,int value){node* pNode=head;node* deleteNode=NULL;if(head==NULL){ cout<<"链表为空"<<endl; return NULL;}else if(head->value==value)//头节点为目标节点{deleteNode=head;head=head->next;}else{ while(pNode->next!=NULL&&pNode->next->value!=value)//找出目标节点的上一个节点 pNode=pNode->next; if(pNode->next!=NULL&&pNode->next->value==value) { deleteNode=pNode->next; pNode->next=pNode->next->next;//删除目标节点 }} if(deleteNode!=NULL) { delete deleteNode; deleteNode=NULL; }return head;}
从头到尾遍历链表
/*从头到尾遍历链表*/void travelList(node*head){node* pNode=head;if(head==NULL)return ;else{ cout<<pNode->value<<'\t'; while(pNode->next!=NULL) { pNode=pNode->next; cout<<pNode->value<<'\t'; }} }
从尾到头打印每个结点,我们从头到尾遍历链表,并把每个节点放在stack结构中,利用stack结构先进后出”的特点,从尾到头打印结点。时间复杂度为O(n).
/*从尾到头遍历链表*/void printNodeReserve(node* head){stack<node*> nodeStack;node * pNode=head;if(head==NULL)return ;//遍历链表,并把节点保留在stack里while(pNode!=NULL){nodeStack.push(pNode);pNode=pNode->next;}while(!nodeStack.empty()){ pNode=nodeStack.top(); //返回top节点 cout<<pNode->value<<endl; nodeStack.pop();//删除top节点}}
输出链表中倒数第K个结点。
为了实现一次遍历链表就能找到倒数第K个节点,我们定义两个指针p1,p2。第一个指针p1从链表头指针开始往前走k步,此时,第二个指针p2不动。从第k+1步开始,指针p2也开始头链表头开始遍历,两个指针距离是k.当p1遍历完链表,指向一个null值的时候,p2指针正好是倒数第k个结点。
比如查找倒数第2个指针
//查找链表中倒数第k个节点,并输出void printKthTOTotal(node *head, int k){//如果链表为空,或k为0,return if(head==NULL||k<=0) return;node* pNode1=head;node* pNode2=head;//p1指针先往前走k步while(k>0&&pNode1!=NULL){pNode1=pNode1->next;k--;}//当链表长度小于k,returnif(k>0)return; while(pNode1!=NULL){pNode1=pNode1->next;pNode2=pNode2->next;}cout<<pNode2->value<<endl;}
/1 0
- c++ 链表操作:添加、遍历、删除、查找
- c之链表各种操作---初始化,添加、删除、定位、遍历
- 链式链表的相关操作+删除+添加+逆序+遍历
- C语言实现顺序表的插入、删除、查找、遍历等基本操作
- C语言---双向链表的插入、删除、查找操作
- C语言---双向链表的插入、删除、查找操作
- 顺序表的建立、插入、删除、查找、遍历操作
- 数组的添加、删除、排序、与字符串之间的转换、截取、查找、遍历操作总结!!!
- C++ vector的初始化、添加、遍历、插入、删除、查找、排序、释放操作
- 单链表建立,插入,删除,查找,遍历操作
- 单链表建立,插入,删除,查找,遍历操作
- 二叉树查找,遍历,删除操作
- 单链表建立,插入,删除,查找,遍历操作!!!!
- 顺序表的相关操作+删除+添加+遍历+逆序
- 数据结构双向链表的基本操作,包括创立,删除,添加和遍历等
- C语言顺序表的插入、删除、查找操作实现
- 单循环链表的初始化、插入、删除、遍历、查找
- C语言 单向链表的创建、遍历、排序、删除操作
- SQL 数据库 试题精华大全
- iOS 新特性
- 九度oj 题目1024:畅通工程
- [POJ 3164] Command Network 有向图的最小树形图(朱刘算法)
- Dedecms网站地图获取文章列表支持标签调用
- c++ 链表操作:添加、遍历、删除、查找
- Cortex-AX系列性能对比
- 从感悟中阅读
- 《猫》第一课时说课稿
- 星星
- VC++中实现程序启动后隐藏窗口,最小化到托盘图标。
- 利用9个数组组成三组数
- Android 文件读取总结
- 一份某品牌天猫专卖店运营计划书