链表创建,添加,反转等
来源:互联网 发布:标题优化免费软件 编辑:程序博客网 时间:2024/05/16 00:48
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
假设有链表A->B->C->D->E->F->G。在反转链表过程中的某一阶段,其链表指针指向为:A<-B<-C<-D E->F->G。也就是说在结点D之前的所有结点都已经反转,而结点D后面的结点E开始的所有结点都没有反转。这样D跟E之间存在了断裂。我们如果要实现链表的反转,会有以下几个重要步骤:
D->E变为D->C,指针反转
指针往后移动一个,操作下一个结点E
结合1.2我们发现需要操作3个指针,分别是C,D,E。
因此可以考虑存储C/D/E三个结点的指针,通过这三个结点的指针实现反转。
#include<iostream>#include<stdlib.h>#include<stack>using namespace std;//链表结构struct ListNode{ int m_nValue; ListNode* m_pNext;};//创建一个链表结点ListNode* CreateListNode(int value){ ListNode *pNode=new ListNode(); pNode->m_nValue=value; pNode->m_pNext=NULL; return pNode;}//遍历链表中的所有结点void PrintList(ListNode* pHead){ ListNode *pNode=pHead; while(pNode!=NULL) { cout<<pNode->m_nValue<<" "; pNode=pNode->m_pNext; } cout<<endl;}//往链表末尾添加结点/*注意这里pHead是一个指向指针的指针,在主函数中一般传递的是引用。因为如果要为链表添加结点,那么就会修改链表结构,所以必须传递引用才能够保存修改后的结构。*/void AddToTail(ListNode** pHead,int value){ ListNode* pNew=new ListNode();//新插入的结点 pNew->m_nValue=value; pNew->m_pNext=NULL; if(*pHead==NULL)//空链表 { *pHead=pNew; } else { ListNode* pNode=*pHead; while(pNode->m_pNext!=NULL) pNode=pNode->m_pNext; pNode->m_pNext=pNew; }}ListNode* ReverseList(ListNode* pHead){ ListNode* pNode=pHead;//当前结点 ListNode* pPrev=NULL;//当前结点的前一个结点 ListNode* pReversedHead=NULL;//反转链表头结点 while(pNode!=NULL) { ListNode* pNext=pNode->m_pNext; if(pNext==NULL)//如果当前结点的下一个结点为空,那么反转链表的头结点就是当前结点。 pReversedHead=pNode; pNode->m_pNext=pPrev;//当前结点指向前一个结点 pPrev=pNode;//pPrev和pNode往前移动。 pNode=pNext;//这里要使用前面保存下来的pNext,不能使用pNode->m_pNext } return pReversedHead;//返回反转链表头指针。}void main(){ //创建结点 ListNode* pNode1=CreateListNode(1);//创建一个结点 PrintList(pNode1);//打印 //往链表中添加新结点 AddToTail(&pNode1,2);//为链表添加一个结点 AddToTail(&pNode1,3);//为链表添加一个结点 AddToTail(&pNode1,4);//为链表添加一个结点 AddToTail(&pNode1,5);//为链表添加一个结点 AddToTail(&pNode1,6);//为链表添加一个结点 AddToTail(&pNode1,7);//为链表添加一个结点 //打印链表 PrintList(pNode1);//打印 //反转链表 ListNode* pReversedHead=ReverseList(pNode1); PrintList(pReversedHead);//打印 system("pause");}
原文http://www.cnblogs.com/xwdreamer/archive/2012/04/26/2472797.html
0 0
- 链表创建,添加,反转等
- 单循环链表-创建、插入、删除、反转等操作
- string 动态双向链表的创建、排序,反转等
- 链表创建、反转
- 单链表反转问题(带头结点 和 不带头结点的 创建链表过程等)
- 链表创建及反转
- PAT 乙等 1025 反转链表
- 创建数据库、添加文件、表等操作
- [数据结构]链表创建、打印、反转
- 链表操作:创建,插入,排序,反转
- 链表的创建 打印 反转
- 链表操作:创建,插入,排序,反转
- 【基础练习】链表排序,反转,划分,拷贝等
- 利用Collections类操作链表(排序,反转等)
- PAT 1025 乙等 (反转链表) c++
- 使用sql语句创建表、修改表、添加列等
- Mysql创建表,删除表,添加列等基本操作
- 单向链表的相关操作总结:创建、删除、查找、排序、统计链表大小、链表的反转和遍历等
- springmvc—handlermapping三种映射
- 有关字节
- SSM框架中集成批量导入Mysql数据库功能
- Tomcat的性能与最大并发(1000)
- 几种形貌贵金属纳米材料的制备方法
- 链表创建,添加,反转等
- C++之线程信号量机制
- 为任务关键型Java应用优化垃圾回收(转载【写的很好】)
- 占位
- Android中的Handler解析
- 小狼豪设置定制accept中的键名
- 使用腾讯前端Jx框架写自己的方法
- 最为简易的listView (访问数组资源arrays.xml)
- Android里WebView详解(一)