Reverse Linked List
2015-06-11 10:59
148 查看
思路:
方法一:迭代。
创建第二个链表,第一个链表从头掉下来的节点从头插到第二个链表中。
时间复杂度O(N),空间复杂度O(N)。
方法二:迭代。
直接在原链表上onepass。
时间复杂度O(N),空间复杂度O(1)。要比方法一效率高。
方法三:递归。
从头结点开始不断向下递归,到达尾节点后反转,然后回到上一层,继续。如果节点个数N过大,递归层次会很深。
方法一:迭代。
创建第二个链表,第一个链表从头掉下来的节点从头插到第二个链表中。
时间复杂度O(N),空间复杂度O(N)。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseList(ListNode* head) { if(head == nullptr || head->next == nullptr) return head; ListNode *second = new ListNode(-1); ListNode *head_tmp = head; while(head != nullptr) { ListNode *node = new ListNode(head->val); node->next = second->next; second->next = node; head = head->next; delete(head_tmp); head_tmp = head; } head = second->next; return head; } };
方法二:迭代。
直接在原链表上onepass。
时间复杂度O(N),空间复杂度O(1)。要比方法一效率高。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseList(ListNode* head) { if(head == nullptr || head->next == nullptr) return head; else { ListNode *pre = head; ListNode *cur = pre->next; pre->next = nullptr; ListNode *post = cur->next; while(post != nullptr) { cur->next = pre; pre = cur; cur = post; post = post->next; } cur->next = pre; return cur; } } };
方法三:递归。
从头结点开始不断向下递归,到达尾节点后反转,然后回到上一层,继续。如果节点个数N过大,递归层次会很深。
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { private: ListNode *reverse(ListNode *head) { if(head->next == nullptr) { return head; }else { ListNode *tail = reverse(head->next); tail->next = head; tail = tail->next; tail->next = nullptr; return tail; } } public: ListNode* reverseList(ListNode* head) { if(head == nullptr || head->next == nullptr) { return head; } ListNode *newhead = head; while(newhead->next != nullptr) { newhead = newhead->next; } reverse(head); return newhead; } };
相关文章推荐
- Linux下Makefile的编写
- Leetcode[153]-Find Minimum in Rotated Sorted Array
- Java实现验证码图片
- android-async-http框架之与网络进行数据交互
- POJ 2403
- POJ 2405
- POJ 2410
- Android 从入门到精通 第七章 事件
- gre填空句子分割法解析
- IIS6.0搭建FTP服务器,以及建立多用户FTP
- 算法学习笔记:关联分析(转)
- 10 Python Optimization Tips and Issues
- POJ 2406
- vi 多窗口同步滚动--适用于人工文件比较
- 大量SYN_RECV,80端号占死(优秀)
- [Android][Activity] XML parse
- Android Java 程序员必备开发工具
- ios-html-get/post的区别,一言以蔽之(MS)CheckST
- OpenCV归纳】5 图像处理
- ContentProvider