• [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}.

    OH! MY GOD! I HATE LINKED LIST!

    看似简单,实现起来总会遇到各种指针错误,写程序之前最好先在纸上好好画画,把各种指针关系搞搞清楚。

    本题的想法就是先将列表平分成两份,后一份逆序,然后再将两段拼接在一起,逆序可用头插法实现。注意这里的函数参数要用引用,否则无法修改指针本身的值!

     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 reverseList(ListNode *&head) {
    12         ListNode *h = new ListNode(0);
    13         ListNode *tmp;
    14         while (head != NULL) {
    15             tmp = head->next;
    16             head->next = h->next;
    17             h->next = head;
    18             head = tmp;
    19         }
    20         head = h->next;
    21     }
    22 
    23     void twistList(ListNode *&l1, ListNode *&l2) {
    24         ListNode *p1, *p2, *tmp;
    25         p1 = l1; p2 = l2;
    26         while (p1 != NULL && p2 != NULL) {
    27             tmp = p2->next;
    28             p2->next = p1->next;
    29             p1->next = p2;
    30             p1 = p1->next->next;
    31             p2 = tmp;
    32         }
    33     }   
    34 
    35     void reorderList(ListNode *head) {
    36         if (head == NULL || head->next == NULL || head->next->next == NULL) {
    37             return;
    38         }
    39         ListNode *slow, *fast;
    40         slow = head; fast = head;
    41         while (fast != NULL && fast->next != NULL) {
    42             slow = slow->next;
    43             if (fast->next->next == NULL) {
    44                 break;
    45             }
    46             fast = fast->next->next;
    47         }
    48         ListNode *l2 = slow->next;
    49         slow->next = NULL;
    50         reverseList(l2);
    51         twistList(head, l2);
    52     }
    53 };
  • 相关阅读:
    在Fragment中保存WebView状态
    Code First下迁移数据库更改
    脚本解决.NET MVC按钮重复提交问题
    1.1C++入门 未完待续。。。
    0.0C语言重点问题回顾
    12F:数字变换
    12G:忍者道具
    12D:迷阵
    12C:未名冰场
    12B:要变多少次
  • 原文地址:https://www.cnblogs.com/easonliu/p/3642822.html
Copyright © 2020-2023  润新知