LeetCode(143) Reorder List
2015-08-09 21:06
363 查看
嘻唰唰对解答的分析很到位。
第一步:分析出链表分割点在第L/2 + 1个节点(第1,第2…);
第二步:通过快慢指针找出链表的第L/2 + 1个节点,值得学习
第三步:翻转链表
第四步:插入
选择将功能封装进子函数进行编程,降低编程的错误率以及降低程序出错后找错的难度。
第一步:分析出链表分割点在第L/2 + 1个节点(第1,第2…);
第二步:通过快慢指针找出链表的第L/2 + 1个节点,值得学习
[code] 二指针:前后指针、相向指针、背靠背指针、快慢指针 三指针 四指针
第三步:翻转链表
第四步:插入
选择将功能封装进子函数进行编程,降低编程的错误率以及降低程序出错后找错的难度。
[code]/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *findMid(ListNode *head) { if(head == NULL) return NULL; ListNode *fast = head; ListNode *slow = head; while(fast->next != NULL) { fast = fast->next; if(fast->next != NULL) fast = fast->next; slow = slow->next; } return slow; } ListNode *reverse(ListNode *head) { if(head == NULL || head->next == NULL) return head; ListNode *pre = head; ListNode *cur = pre->next; while(cur) { ListNode *tmp = cur->next; cur->next = pre; pre = cur; cur = tmp; } head->next = NULL; return pre; } void reorderList(ListNode* head) { if(!head) return; ListNode *mid = findMid(head); ListNode *right = reverse(mid); ListNode *left = head; while(right->next != NULL) { ListNode *tmpRight = right->next; ListNode *tmpLeft = left->next; left->next = right; right->next = tmpLeft; left = left->next->next; right = tmpRight; } } };
相关文章推荐
- js获取Url后的数据转换为json
- C#根据身份证号码,计算生日、年龄、性别
- [SDOI2011][BZOJ2286] 消耗战|虚树|树型dp|树上倍增LCA
- 欧拉工程第58题:Spiral primes
- unity3d碰撞检测之立方体碰撞算法
- mongodb3.0.5的用户权限认证和使用可视化工具登录的一系列问题
- 华为OJ(输出数组最小k个数)
- UVA - 10132 File Fragmentation
- 指数型母函数理解
- Tian Ji -- The Horse Racing
- uva11992-Fast Matrix Operations(区间增值、改值)
- 107. Binary Tree Level Order Traversal II
- Majority Element:主元素
- 欧拉工程第57题:Square root convergents
- 读书笔记之c和指针(10)
- 集训感悟
- 排序算法之快速排序
- HDOJ1005
- Linux下线程相关知识总结
- 但是,在通过移动数组的上升周期中找到指定元素