zoukankan      html  css  js  c++  java
  • Leecode no.143 重排链表

    package leecode;

    /**
    * 143. 重排链表
    *
    * 给定一个单链表 L 的头节点 head ,单链表 L 表示为:
    * L0 → L1 → … → Ln - 1 → Ln
    * 请将其重新排列后变为:
    * L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
    * (说人话就是说把最后一个插到第一个后面,把倒数第二个插到第二个后面 以此类推...)
    *
    * @author TANG
    * @date 2021/12/22
    */
    public class ReorderList {


    /**
    * 第一次遍历找到链表中间的位置
    * 拆分成两个链表
    * 第二次遍历 翻转后半链表
    *
    * 第三次遍历 两个链表顺序插入
    *
    * @param head
    */
    public void reorderList(ListNode head) {
    //第一步 快慢指针找到链表中点
    ListNode slow = head;
    ListNode fast = head;

    //快指针走两步 慢指针走一步 最后慢指针作为中点
    while(fast != null && fast.next != null) {
    slow = slow.next;
    fast = fast.next.next;
    }

    //第二步
    //翻转新链表
    ListNode newList = slow.next;
    slow.next = null;

    //temp代表下一个要反转的元素
    if(newList == null) {
    return;
    }
    ListNode temp = newList.next;
    newList.next = null;
    while(temp != null) {
    ListNode tempNext = temp.next;
    temp.next = newList;
    newList = temp;
    temp = tempNext;
    }
    //翻转后起始元素是newList

    //第三步 合并插入
    while(head != null && newList != null) {
    ListNode headNext = head.next;
    ListNode newNext = newList.next;
    head.next = newList;
    newList.next = headNext;

    head = headNext;
    newList = newNext;
    }



    }

    }
  • 相关阅读:
    Shell 字符串处理
    Shell 变量替换及测试
    ARTS(一)
    instanceof & isAssignableFrom的异同
    mysql 分组排序取最值
    guava-retrying 源码解析(阻塞策略详解)
    guava-retrying 源码解析(时间限制策略)
    guava-retrying 源码解析(停止策略详解)
    guava-retrying 源码解析(等待策略详解)
    guava-retrying 源码解析(导入项目)
  • 原文地址:https://www.cnblogs.com/ttaall/p/15719811.html
Copyright © 2011-2022 走看看