单链表的反转(数据结构 面试题)
来源:互联网 发布:淘宝美工每天工作任务 编辑:程序博客网 时间:2024/04/19 01:13
编写一个算法来颠倒一个链表,该链表的第一个结点由first指向。不要复制列表元素;而是重置链接和指针,使得first指向原来的最后一个结点,并且结点之间的所有链接都反向。
思路:因为题目中明确说明不能复制元素,所以通过复制来重置另外一个链表的想法被终止。我们想到,如果要改变连接的指向,又能够要使链表继续遍历,那么最少需要先遍历到几个结点呢?答案是3个。如图:(第二张是将要结束时的情况)
3个结点之后就可以对第一个连接进行反转,直到cur->next-==NULL结束,然后对最后一个特殊处理即可,详见代码。
#include <iostream>#include <ctime>#include <string>#include <string.h>#include <algorithm>using namespace std;template <typename T>class clist{public:struct node{T value;node* next;node(T v=NULL) :value(v){}};node *front;node *tail;int size;clist(node *f = NULL, node*t = NULL, int s = NULL) :front(f), tail(t), size(s){}~clist(){if (!size){node* temp = front;node* pre = NULL;while (temp != tail){pre = temp;temp = temp->next;delete pre;}delete temp;size = 0;}}void build_list_rand(int len){//创建一条任意长度的为len的链表srand((unsigned)time(NULL));front = new node();front->value = rand()%100+1;node* temp = front;size++;while (size<len){temp->next = new node;temp->value = rand()%100+1;temp = temp->next;size++;}tail = temp;tail->value = rand()%100+1;tail->next = NULL;}void swap(node* &a, node* &b){//交换两个指针node* temp = a;a = b;b = temp;}void clist<T>::reserve(){//反转函数node* head=NULL, *mid=NULL, *follow=NULL, *temp=NULL;if (size <= 1)return;else if (size == 2){swap(front, tail);front->next = tail;tail->next = NULL;}else{swap(front, tail);head = tail;mid = tail->next;follow = mid->next;while (follow != NULL){mid->next = head;head = mid;mid = follow;follow = follow->next;}mid->next = head;tail->next = NULL;}}void display(){//打印整个链表和长度node* temp = front;while (temp != tail){cout << temp->value << ' ';temp = temp->next;}cout << temp->value << endl;cout << "the size is " << size << endl;}};int main(){clist<int> a;int b;cout << "请输入您要反转的链表的长度:" << endl;cin >> b;a.build_list_rand(b);a.display();a.reserve();a.display();return 0;}运行结果:
1 0
- 单链表的反转(数据结构 面试题)
- (程序员面试题)单链表的反转
- 面试题-单链表反转
- 【面试题】-单链表反转
- 单链表反转面试题
- 面试题(数据结构)
- 嵌入式软件工程师面试题--字符串的反转
- java面试题:字符串的反转
- 剑指offer算法题之单链表的反转--面试题16:反转链表
- 剑指offer 面试题16 反转单链表
- 链式存储面试题-单链表反转
- 多种单链表反转面试题总结
- bat面试题 python 单链表反转排序
- 面试题:反转字符串
- 【面试题】-反转句子
- 常见的数据结构面试题
- 数据结构面试题(1)
- 微软面试题:反转字符串
- 创建线程池
- lesson2-java虚拟机之jvm结构
- 程序员的年龄天花板
- Linux下Sed的用法详情
- javascript enval()函数与JSON 之间关系
- 单链表的反转(数据结构 面试题)
- 欢迎使用CSDN-markdown编辑器
- 第一个android和php的案例开始
- Valid Sudoku
- Android硬件抽象层(HAL)模块编写规范
- 面向对象知识点梳理(3)
- uva 1291 dp
- CS,九,十,十一,十二
- Android异步消息处理机制(3)AsyncTask基本使用