面试题18:反转链表
2015-12-16 15:19
531 查看
题目:
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
边界条件:
head为空,只有一个结点,只有两个结点,超过3个结点。
思路:
可以用三个指针来指向连续地3个结点,然后让第二个指针的next指向第一个指针,在将3个指针往后移动,这样只需遍历一次链表,就可以实现链表反转。
时间复杂度:O(n)
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
边界条件:
head为空,只有一个结点,只有两个结点,超过3个结点。
思路:
可以用三个指针来指向连续地3个结点,然后让第二个指针的next指向第一个指针,在将3个指针往后移动,这样只需遍历一次链表,就可以实现链表反转。
时间复杂度:O(n)
#include <iostream> #include <vector> #include <string> #include <stack> #include <algorithm> using namespace std; struct ListNode{ int value; ListNode *next; ListNode(int a){ value = a; next = NULL; } }; ListNode *ReverseList(ListNode *head) { if (head == NULL || head->next == NULL) return head; ListNode* p1 = head, *p2 = head->next, *p3 = p2->next; while (p3 != NULL) { p2->next = p1; p1 = p2; p2 = p3; p3 = p3->next; } p2->next = p1; head->next = NULL; return p2; } int main() { ListNode *a1 = new ListNode(1); ListNode *a2 = new ListNode(2); ListNode *a3 = new ListNode(3); ListNode *a4 = new ListNode(4); ListNode *a5 = new ListNode(5); a1->next = a2; a2->next = a3; a3->next = a4; a4->next = a5; ListNode *re = ReverseList(a1); for (; re != NULL; re = re->next) cout << re->value << " "; cout << endl; return 0; }如果用递归方法做,更简单:
ListNode *ReverseListByRecursive(ListNode *head) { if (head==NULL||head->next == NULL) return head; ListNode *newNode = ReverseListByRecursive(head->next); head->next->next = head; head->next = NULL; return newNode; }
相关文章推荐
- 黑马程序员_java基础_String类和基本数据类型的包装类
- 黑马程序员_java入门
- 黑马程序员——第十篇:异常处理、File类
- 测试职场升迁之路
- 黑马程序员————JAVA基础之抽象类、接口
- 黑马程序员---Java基础---异常、File类和递归
- wordpress 深度集成 markdown
- 黑马程序员——第九篇:Integer、Character、正则表达式、大数据运算、日期类
- 黑马程序员——IO流
- 鹅厂面试小记
- 黑马程序员---Java基础篇之流程控制语句及控制跳转语句
- 如何成为牛逼的程序员
- 一个fork的面试题
- 在线的面试题.......
- loadrunner常见问题分析及理论小知识
- 【面试总结】美团测试实习生面试
- 程序员保值的4个秘密
- 黑马程序员---Java基础---双列集合Map(接口)
- 写给想当程序员的朋友 -- 一个还不太老的程序员的体会
- 2015百度校园招聘面试题