• 重排链表


    给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
    将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…
    你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
    示例 1:
    给定链表 1->2->3->4, 重新排列为 1->4->2->3.
    示例 2:
    给定链表 1->2->3->4->5, 重新排列为 1->5->2->4,

    思路:1.利用快慢指针找到中间结点,将链表分为前后链表

    2.逆转中间结点后面的

    3.将逆转后的链表插入前面的链表

    代码如下:

    public void reorderList(ListNode head) {
            if(head == null || head.next == null) return;
            //找到中间结点
            ListNode fast = head;
            ListNode slow = head;
            while(fast!=null&&fast.next!=null) {
                fast = fast.next.next;
                slow = slow.next;
            }
            //标记slow下一个结点,并让slow.next == null
            ListNode tmp = slow.next;
            slow.next = null;
            //逆转slow结点后面的结点
            ListNode s = reverse(tmp);
            ListNode f = head;
            //将逆序后的每一个结点进行插入
            while(s!=null) {
                ListNode cur = s.next;
                s.next = f.next;
                f.next = s;
                f = s.next;
                s = cur;
            }
  • 相关阅读:
    Linux上统计文件夹下文件个数
    linux----tail 过滤日志文件中的关键字
    Linux----Makefile
    Python--day 3
    Python--day 2
    Python--day 1
    Ubuntu14.04 64位网易云播放器
    qt 串口通信学习的目录
    qt layout 注意要点
    模拟电子第一章半导体
  • 原文地址:https://www.cnblogs.com/du001011/p/10646519.html
Copyright © 2020-2023  润新知