zoukankan      html  css  js  c++  java
  • 62. 链表重排[Reorder List]

    【本文链接】

    http://www.cnblogs.com/hellogiser/p/reorder-list.html

    【题目】

    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 {1,2,3,4,5,6,7}, reorder it to {1,7,2,6,3,5,4}.

    【分析】

    题目思路比较直接:

    (1)找到链表的中间节点,把链表划分成2个子链表;如果原链表长度为奇数,那么第一个子链表的长度多1;

    (2)翻转第二个子链表;

    (3)交叉合并两个子链表。

    例如{1,2,3,4,5,6,7}

    (1)找到链表的中间节点为4,把链表划分成2个子链表:{1,2,3,4}和{5,6,7};

    (2)翻转第二个子链表得到{7,6,5}

    (3)交叉合并{1,2,3,4}和{7,6,5}得到{1,7,2,6,3,5,4}

    【代码】

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    // 62_ReorderList.cpp : Defines the entry point for the console application.
    //
    /*
        version: 1.0
        author: hellogiser
        blog: http://www.cnblogs.com/hellogiser
        date: 2014/5/30
    */

    #include "stdafx.h"

    struct ListNode
    {
        
    int value;
        ListNode *next;
    };

    // find middle node of list
    ListNode *FindMiddleNode(ListNode *head)
    {
        
    if(NULL == head)
            
    return NULL;
        ListNode *fast = head, *slow = head;
        
    while(fast != NULL && fast->next != NULL)
        {
            
    // move fast 2 steps
            fast = fast->next->next;
            
    if (fast == NULL)
                
    break;
            
    // move slow 1 step
            slow = slow->next;
        }
        
    return slow;
    }

    // reverse list
    ListNode *ReverseList(ListNode *head)
    {
        
    if(NULL == head || NULL == head->next)
            
    return head;
        ListNode *prev = 
    NULL, *cur = head, *next = NULL;
        
    while(cur != NULL)
        {
            
    // save next
            next = cur->next;
            
    // reverse
            cur->next = prev;
            
    // update prev and cur
            prev = cur;
            cur = next;
        }
        
    return prev;
    }

    // cross merge list
    ListNode *CrossMergeList(ListNode *head1, ListNode *head2)
    {
        
    if(NULL == head1)
            
    return head2;
        
    else if (NULL == head2)
            
    return head1;

        ListNode *node1 = head1, *node2 = head2;
        
    while(node2 != NULL)
        {
            ListNode *temp1 = node1->next;
            ListNode *temp2 = node2->next;
            node1->next = node2;
            node2->next = temp1;
            
    // update node1 node2
            node1 = temp1;
            node2 = temp2;
        }
        
    return head1;
    }

    // reorder list
    ListNode *ReOrderList(ListNode *head)
    {
        
    if(NULL == head || NULL == head->next)
            
    return head;

        
    // find middle node of list
        ListNode *middle = FindMiddleNode(head);
        
    // split into 2 lists
        ListNode *head1 = head;
        ListNode *head2 = middle->next;
        
    // detach the 2 lists
        middle->next = NULL;
        
    // reverse list2
        head2 = ReverseList(head2);
        
    // cross merge 2 lists
        return CrossMergeList(head1, head2);
    }

    【参考】

    http://blog.csdn.net/whuwangyi/article/details/14146461

    【本文链接】

    http://www.cnblogs.com/hellogiser/p/reorder-list.html

    个人学习笔记,欢迎拍砖!---by hellogiser

    Author: hellogiser
    Warning: 本文版权归作者和博客园共有,欢迎转载,但请保留此段声明,且在文章页面明显位置给出原文连接。Thanks!
    Me: 如果觉得本文对你有帮助的话,那么【推荐】给大家吧,希望今后能够为大家带来更好的技术文章!敬请【关注】
  • 相关阅读:
    Marshal Code Into Another Thread(STAThread)
    MongoDB分片实战(二):Sharding
    项目中如何添加CorePlot开源框架(重温Xcode链接静态库)
    Xcode4.2中将Three20开源库导入到工程项目中
    Ajax在MVC中的使用
    位枚举的学习
    MVC3+NHibernate项目实战(二) :数据库访问层
    MVC3+NHibernate项目实战(一) :项目设计
    Android VideoView
    00设计原则
  • 原文地址:https://www.cnblogs.com/hellogiser/p/reorder-list.html
Copyright © 2011-2022 走看看