zoukankan      html  css  js  c++  java
  • LeetCode:Reorder List

    题目(题目链接):

    Given a singly linked list LL0L1→…→Ln-1Ln,
    reorder it to: L0LnL1Ln-1L2Ln-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}.

    分析:先用快慢指针找到链表的中点,然后翻转链表后半部分,再和前半部分组合。需要注意的是把链表分成两半时,前半段的尾节点要置为NULL,翻转链表时也要把尾节点置为NULL。代码如下:

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     void reorderList(ListNode *head) {
    12         // IMPORTANT: Please reset any member data you declared, as
    13         // the same Solution instance will be reused for each test case.
    14         if(head == NULL || head->next == NULL)return;
    15         ListNode *fastp = head, *lowp = head, *tail = NULL;
    16         while(fastp != NULL && fastp->next != NULL)
    17         {//利用快慢指针找到链表的中点
    18             tail = lowp;
    19             fastp = fastp->next->next;
    20             lowp = lowp->next;
    21         }
    22         tail->next = NULL; //此时tail 指向前半段的结尾
    23         reverseList(lowp);//翻转链表后半段
    24         fastp = head;
    25         tail = NULL;
    26         while(fastp != NULL)
    27         {
    28             ListNode *tmp = lowp->next;
    29             lowp->next = fastp->next;
    30             fastp->next = lowp;
    31             tail = lowp;
    32             fastp = lowp->next;
    33             lowp = tmp;
    34         }
    35         if(lowp != NULL)
    36             tail->next = lowp;
    37 
    38     }
    39     void reverseList(ListNode* &head)
    40     {//翻转链表
    41         if(head == NULL || head->next == NULL)return;
    42         ListNode *pre = head, *p = pre->next;
    43         while(p != NULL)
    44         {
    45             ListNode *tmp = p->next;
    46             p->next = pre;
    47             pre = p;
    48             p = tmp;
    49         }
    50         head->next = NULL;
    51         head = pre;
    52     }
    53 };

    扩展:如果不是链表是数组怎么样得到相同的序列,请参考博客 here 完美洗牌算法

    【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3416938.html

  • 相关阅读:
    安卓开发笔记——Broadcast广播机制(实现自定义小闹钟)
    安卓开发笔记——ListView加载性能优化ViewHolder
    安卓智能聊天机器人开发(二)
    安卓智能聊天机器人开发(一)
    基于Tcp协议的简单Socket通信实例(JAVA)
    Gson简要使用笔记
    JAVA的String 类【转】
    Oracle EBS R12 客户表结构
    EBS登陆界面个性化
    EBS取Web字段SQL操作文档
  • 原文地址:https://www.cnblogs.com/TenosDoIt/p/3416938.html
Copyright © 2011-2022 走看看