Reorder List的总结

来源:互联网 发布:淘宝助理5.0旧版本 编辑:程序博客网 时间:2024/06/06 04:14

题目:http://www.lintcode.com/zh-cn/problem/reorder-list/

给定一个单链表L: L0L1→…→Ln-1Ln,

重新排列后为:L0LnL1Ln-1L2Ln-2→…

必须在不改变节点值的情况下进行原地操作。

一.目的:将一个链表不断的头尾链接

二.思路:

第一步,先将整个链表分为前后两部分,用快慢指针的方法查找中点;

第二步,将后面的部分翻转;

第三部,创建一个新的node,将两个链表归并入这个新的链表

三.易错点:

1.翻转后半部分时候,传入的数据应该为mid的后一个,且fast在定义的时候应该为slow的下一个而不是同一起点;

2.翻转之后mid节点后面应该加一个null节点;

3.快慢节点找中点时候判断是否结束语句应该先 fast 后fast.next,因为如果当fast 指向空时,此时无 next 这时候先判断next 程序会报错


该题代码如下:

/**
 * Definition for ListNode.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int val) {
 *         this.val = val;
 *         this.next = null;
 *     }
 * }
 */ 
public class Solution {
    /**
     * @param head: The head of linked list.
     * @return: void
     */
    public void reorderList(ListNode head) {  
        if(head == null || head.next == null){
            return;
        }
        ListNode mid = findMid(head);
        ListNode tail = reverse(mid.next);               //不是传入mid
        mid.next = null;                                  //易忘记
        merge(head,tail);
    }
    
    private ListNode reverse(ListNode head){
        ListNode newhead = null;
        while(head != null){
            ListNode temp = head.next;
            head.next = newhead;
            newhead = head;
            head = temp;
        }
        return newhead;
    }
    
    private ListNode findMid(ListNode head){
        ListNode slow = head , fast = head.next;
        while(fast != null && fast.next != null){           //先fast后fast.next 否则将会出错 如2-1-0-null
        //while(fast.next != null && fast != null){    
            fast = fast.next.next;
            slow = slow.next;
        }
        return slow;
    }
    
    private void merge(ListNode node1,ListNode node2){
        int index = 0;
        ListNode dummy = new ListNode(0);
        while(node1 != null && node2 != null){
            if(index % 2 ==0){
                dummy.next = node1;
                node1 = node1.next;
            }else{
                dummy.next = node2;
                node2 = node2.next;
            }
            index++;
            dummy = dummy.next;
        }
        if(node1 == null){
            dummy.next = node2;
        }else{
            dummy.next = node1;
        }
    }
}

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩好动坐不定怎么办 宝宝喜欢用左手怎么办 最近老是做噩梦怎么办 总是做噩梦是怎么办 幼儿总是动手打人怎么办 幼儿爱打人老师怎么办 一岁多宝宝太皮怎么办 小孩会有多动症怎么办 我小孩有多动症怎么办 家有多动症孩子怎么办 4岁宝宝多动症怎么办 四岁宝宝多动症怎么办 一岁宝宝多动症怎么办 5岁宝宝多动症怎么办 7岁宝宝多动症怎么办 小宝宝太调皮了怎么办 3岁宝宝好动怎么办 四岁宝宝好动怎么办 好动的孩子应该怎么办 孩子上课总发呆怎么办 小孩上课发呆走神怎么办 宝宝幼儿园坐不住怎么办 孩孑上课听不懂怎么办 25岁儿子不听话怎么办 幼儿午睡爱说话怎么办 幼儿园实习很累怎么办 怀孕后脚气严重怎么办 拼音a不会写怎么办 儿童7岁还坐不住怎么办 孩子缺锌手蜕皮裂开怎么办 宝宝读幼儿园哭怎么办 幼儿上课爱讲话怎么办 孩子上课总是乱跑怎么办 孩子听不懂老师讲课怎么办 高一上课听不懂怎么办 上课学生纪律差怎么办 一年级学生认字少怎么办 孩子上课做不住怎么办 幼儿园小孩上课乱跑怎么办 孩子挑食不爱吃饭怎么办 幼儿园孩子不听指令怎么办