Reorder List 链表操作
2015-07-05 20:13
441 查看
思路:
链表操作的基本操作。属于经典基础题型。
时间复杂度O(N),空间复杂度O(1)。
先找到中间节点,然后后半段反转,再插入到前半段中。
链表操作的基本操作。属于经典基础题型。
时间复杂度O(N),空间复杂度O(1)。
先找到中间节点,然后后半段反转,再插入到前半段中。
/** * 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 == nullptr || head->next == nullptr) return head; ListNode *prev = head; for(ListNode *cur = head->next, *next = cur->next; cur; prev = cur, cur = next, next = next ? next->next : nullptr) { cur->next = prev; } head->next = nullptr; return prev; } public: void reorderList(ListNode* head) { if(head == nullptr || head->next == nullptr || head->next->next == nullptr) return; //find the mid node ListNode *slow = head, *fast = head, *prev = nullptr; while(fast != nullptr && fast->next != nullptr) { prev = slow; slow = slow->next; fast= fast->next->next; } prev->next = nullptr; //reverse the latter ListNode *latter = reverse(slow); //insert ListNode *cur = head; while(cur->next != nullptr) { ListNode *tmp = cur->next; cur->next = latter; latter = latter->next; cur->next->next = tmp; cur = tmp; } cur->next = latter; } };
相关文章推荐
- Java的Interfaces与Callbacks
- hdu 2732 Leapin' Lizards
- java api 里实现好的一个缓存类
- linux程序设计——用信号量进行同步(第十二章)
- linux安装jdk
- C#高级编程三十四天----数组作为参数
- 测试Mysql的最大连接数
- 原码,反码,补码
- MD5超强加密
- 排序 - 快速排序
- 遗传算法
- 排序 - 快速排序
- 语句的应用
- 类什么时候被加载
- Android 水波纹点击效果(Ripple Effect)
- JavaBean
- scss 在mac下编译
- A题 hdu 1235 统计同成绩学生人数
- [BZOJ 1150] [CTSC2007] 数据备份Backup 【贪心 + 链表】
- Java实现二叉堆创建