zoukankan      html  css  js  c++  java
  • LeetCode 143. 重排链表(Reorder List)

    题目描述

    给定一个单链表 LL0L1→…→Ln-1Ln ,
    将其重新排列后变为: L0LnL1Ln-1L2Ln-2→…

    你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

    示例 1:

    给定链表 1->2->3->4, 重新排列为 1->4->2->3.

    示例 2:

    给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.

    解题思路

    大体上分为三步:

    • 首先找到链表的中间位置,从其后面拆开分成两半,保存要反向插入的后半部分的首节点,并把前半部分的最后一个节点的next指针置为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         if(head == NULL || head->next == NULL) return;
    13         ListNode *left = head, *right = head;
    14         while(right){
    15             right = right->next;
    16             if(right){
    17                 right = right->next;
    18                 left = left->next;
    19             }
    20         }
    21         right = left->next;
    22         left->next = NULL;
    23         left = NULL;
    24         ListNode *now = right;
    25         while(now){
    26             right = now->next;
    27             now->next = left;
    28             left = now;
    29             now = right;
    30         }
    31         now = head;
    32         while(left){
    33             right = left->next;
    34             left->next = now->next;
    35             now->next = left;
    36             now = left->next;
    37             left = right;
    38         }
    39     }
    40 };
  • 相关阅读:
    CoreText实现图文混排
    iOS中的数据的存储方式
    获得自定义的所有相簿
    swift基础语法(31- swift可选类型)
    swift内存管理(30- Swift内存管理)
    swift基础语法(29- 析构方法)
    swift基础语法(27- 构造方法,带参数的构造方法,常量存储属性与构造方法,结构体构造方法)
    iOS --旋转动画
    iOS--UILabel上画横线
    iOS--(转)集成银联3.3.0
  • 原文地址:https://www.cnblogs.com/wmx24/p/9447742.html
Copyright © 2011-2022 走看看