反转链表
来源:互联网 发布:淘宝助理旧版本 编辑:程序博客网 时间:2024/06/05 20:32
前天笔试碰见的题,以前室友也问过我,然而我给出的答案是一直获取最后一个节点然后保存下来指向最后一个节点即可,还需要将题目给出的链表结构体添加一些函数才能实现,而且这种做法很蠢!!!所以今天我写一个按照原题的要求写,题目给的结构体为:
(经历这次面试,发现自己太爱钻牛角尖,和室友解答的时候只是随口说说想法装一下自己随便就能做出来的B,并没有去实践去确认,所以到我自己去做的时候发现会出现野指针算法效率低下,用很蠢很烂的方法去做,而不是静下心去分析问题)
struct mylist{ int val; mylist* next;};
问题的关键:从题中的链表结构体我们可以看出,我们要达到反转效果,就需要一个前驱指针给我们带路,然而这个链表无前驱指针,哪怎么办呢?我们自己做标记~
struct mylist { int val; mylist* next; mylist(int m_val) :val(m_val),next(NULL) {}};void reverselist(mylist * &list){ mylist* list_size = list; mylist* pre = NULL; mylist* curr = list; mylist* next = curr->next; int size = 0; while (list_size != NULL)//测试大小 { size++; list_size = list_size->next; } int i = size; while (curr != NULL)//遍历到最后一个节点 { if (pre == NULL)//第一个节点跳过 { pre = curr; curr = curr->next; next = curr->next; i--; continue; } if (i == size - 1)//第一个节点的next置为NULL { curr->next = pre; pre->next = NULL; pre = curr; curr = next; next = next->next; i--; } else { curr->next = pre; pre = curr; if (next == NULL)//如果我们的后继指针为空,则直接break循环,否则后面的语句执行会报错 break; curr = next; next = next->next; i--; } } list = curr;//改变指针指向反转后的第一个节点}int main(){ mylist *a = new mylist(3); mylist *b = new mylist(4); mylist *c = new mylist(5); mylist *d = new mylist(6); a->next = b; b->next = c; c->next = d; cout << "原链表" << a->val << " " << b->val << " " << c->val << " " << d->val<<endl; reverselist(a); cout << "反转后"; while (a != NULL) { mylist *temp=a; cout << a->val << " "; a = a->next; delete temp; temp=NULL; } return 0;}
结果图:
阅读全文
0 0
- 链表反转
- 反转链表
- 单向链表反转
- 链表反转:
- 链表的反转
- 链表反转
- 反转单向链表
- 链表反转
- 单向链表反转
- 单向链表反转
- 链表的反转
- 链表反转
- 反转链表
- 链表反转
- 链表反转
- 链表反转
- 链表反转
- 链表的反转
- 基于SOA的电商项目分布式架构
- ES6的开发环境搭建
- 冰山在融化读书笔记
- (转载)Java后端程序员1年工作经验总结
- Qt只QStringList的简单使用方法
- 反转链表
- Mybatis-02-对数据库的基本操作
- CPHS介绍
- Java 继承,多态,接口,异常和集合框架
- 获取jar包中的文件路径
- 人工智能学习开篇
- Post Man的使用
- Python 2.7.12并安装最新pip
- gpujpeg 简介