博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试题18:反转链表
阅读量:4216 次
发布时间:2019-05-26

本文共 1252 字,大约阅读时间需要 4 分钟。

题目:

定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

边界条件:

head为空,只有一个结点,只有两个结点,超过3个结点。

思路:

可以用三个指针来指向连续地3个结点,然后让第二个指针的next指向第一个指针,在将3个指针往后移动,这样只需遍历一次链表,就可以实现链表反转。

时间复杂度:O(n)

#include 
#include
#include
#include
#include
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;}

转载地址:http://vapmi.baihongyu.com/

你可能感兴趣的文章
Android中Java代码和XML布局效率问题
查看>>
android TextView属性大全(转)
查看>>
Conclusion for Resource Management
查看>>
Conclusion for Constructors,Destructors,and Assignment Operators
查看>>
《浪潮之巅》1 AT&T
查看>>
《浪潮之巅》2蓝色巨人 IBM公司
查看>>
《浪潮之巅》3水果公司的复兴
查看>>
《浪潮之巅》4计算机工业的生态链
查看>>
《浪潮之巅》5奔腾的芯 英特尔公司
查看>>
python语言程序设计基础笔记(三)从题目到方案
查看>>
读取txt文件出现出现多余空行问题
查看>>
从理论到实践开发自己的聊天机器人
查看>>
@***装饰器(python)
查看>>
最优化算法之梯度下降法
查看>>
激活函数之ReLU函数
查看>>
经典排序算法详解
查看>>
概述类加载器及类加载过程
查看>>
MySQL SQL优化总结
查看>>
MySQL MyISAM引擎的读锁与写锁
查看>>
面向对象与面向过程的本质的区别
查看>>