zoukankan      html  css  js  c++  java
  • LeetCode143 重排链表

    给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
    将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…

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

    可以遍历然后存起来,然后空间换时间。

    也可以递归,但是递归的方法需要巧妙一点。

    这里借用windliang的解法,每次往内递归,把head指向tail,tail指向内部处理完的链表的第一个节点。

     1 public void reorderList(ListNode head) {
     2 
     3     if (head == null || head.next == null || head.next.next == null) {
     4         return;
     5     }
     6     int len = 0;
     7     ListNode h = head;
     8     //求出节点数
     9     while (h != null) {
    10         len++;
    11         h = h.next;
    12     }
    13 
    14     reorderListHelper(head, len);
    15 }
    16 
    17 private ListNode reorderListHelper(ListNode head, int len) {
    18     if (len == 1) {
    19         ListNode outTail = head.next;
    20         head.next = null;
    21         return outTail;
    22     }
    23     if (len == 2) {
    24         ListNode outTail = head.next.next;
    25         head.next.next = null;
    26         return outTail;
    27     }
    28     //得到对应的尾节点,并且将头结点和尾节点之间的链表通过递归处理
    29     ListNode tail = reorderListHelper(head.next, len - 2);
    30     ListNode subHead = head.next;//中间链表的头结点
    31     head.next = tail;
    32     ListNode outTail = tail.next;  //上一层 head 对应的 tail
    33     tail.next = subHead;
    34     return outTail;
    35 }
    36 
    37 作者:windliang
    38 链接:https://leetcode-cn.com/problems/reorder-list/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-34/
    39 来源:力扣(LeetCode)
    40 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    第三种方法就是先拆分链表成两半,然后把后半部分翻转,然后两个链表合并。

  • 相关阅读:
    人生小悟1
    对偶传播神经网络(CPN)
    对偶传播神经网络(CPN)
    学习向量量化神经网络
    学习向量量化神经网络
    自组织特征映射神经网络(SOFM)
    自组织特征映射神经网络(SOFM)
    竞争学习的基本概念和原理
    竞争学习的基本概念和原理
    人工神经网络基础概念、原理知识(补)
  • 原文地址:https://www.cnblogs.com/rookiez/p/13369277.html
Copyright © 2011-2022 走看看