LeetCode 143. Reorder List
2017-04-27 00:05
288 查看
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Given
解题思路:计算链表总结点数,然后将后一半节点与前一半节点断开,并将后一半链表原地翻转,然后依次扫描前半链表与后半链表,将后半链表的节点插入到合适的地方。
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Given
{1,2,3,4}, reorder it to
{1,4,2,3}.
解题思路:计算链表总结点数,然后将后一半节点与前一半节点断开,并将后一半链表原地翻转,然后依次扫描前半链表与后半链表,将后半链表的节点插入到合适的地方。
public class Solution { public void reorderList(ListNode head) { if(head!=null && head.next!=null && head.next.next!=null){ //这三种情况下,链表不用调整 int count=0; ListNode p=head; while(p!=null){ //计算出链表的总节点个数 count++; p=p.next; } p=head; int i=1; while(i<=count/2){ //当节点总数为奇数时,等号保证了中间节点分到了前半链表 i++; p=p.next; } //while循环结束后p指向前半链表的最后一个节点 ListNode headb=p.next; //headb始终指向后半节点的头节点 p.next=null; ListNode q=headb; //定义节点q,q向后移动,这里先定义,随便赋值为headb if(headb.next!=null){ q=headb.next; headb.next=null; //一定要截断headb与后面节点的联系 while(q!=null){ ListNode r=q; q=q.next; r.next=headb; headb=r; } } p=head;q=headb; while(p!=null && q!=null){ ListNode pa=p.next; //记录后面的指针,不能将p、q直接赋值给新节点 ListNode qa=q.next; q.next=null; //先截断原链表 q.next=p.next; p.next=q; p=pa; q=qa; } } } }
相关文章推荐
- leetcode ---- 143. Reorder List
- [leetcode]143. Reorder List -- JavaScript 代码
- LeetCode 143. Reorder List
- [LeetCode] 143. Reorder List
- [LeetCode] 143. Reorder List
- [leetcode] 143. Reorder List 解题报告
- LeetCode 143. Reorder List
- Leetcode-143. Reorder List
- 【Leetcode】143. Reorder List - 链表重排序
- 【LeetCode】 143. Reorder List
- [Leetcode] 143. Reorder List 解题报告
- 【Leetcode】143. Reorder List
- LeetCode 143. Reorder List
- [LeetCode]143. Reorder List
- Leetcode- 143. Reorder List
- leetcode143. Reorder List
- leetcode 143. Reorder List
- [leetcode] 【链表】143. Reorder List
- [leetcode]143. Reorder List
- LeetCode 143. Reorder List