1.4 如何对链表进行重新排序

SAP FICO 科目余额查询表开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行) SAP FICO 科目余额查询表开发说明书(包括开发源代码、测试样例) 阅读详情

1.题目

给定链表L0->L1->L2…Ln-1>Ln,把链表重新排序为L0->Ln->L1->Ln-1>L2->Ln-2…
要求:1.在原链表结点上排序,即不能申请新结点
2.只能修改next域,不能修改数据域

2.代码

public class Sort {
    /**
     * 方法功能:找出链表的中间结点,并从中间断成两段
     * 输入参数:链表的头结点
     * 返回值:链表的中间结点
     */

    // 1.slow走一步,fast走两步
    public static Node findMiddleNode(Node head){

        if(head == null || head.next == null){
            return head;
        }

        Node slow = head;
        Node fast = head;
        Node slowPre = head;

        // 要想走两步
        while(fast != null && fast.next != null){
            slowPre = slow;
            slow = slow.next;
            fast = fast.next.next;
        }

        slowPre.next = null;
        return slow;
    }

    /**
     * 方法功能:对不带虚假结点的单链表进行翻转
     * 输入参数:链表的头结点
     */
    public static Node reverseNode(Node head){
         if(head == null || head.next == null){
             return head;
         }

         Node pre = null;
         Node nex = null;
         // null head nex , head和nex不需要考虑什么关系
         while(head != null){
             nex = head.next;
             head.next = pre;
             pre = head;
             head = nex;
         }
         return pre;
    }

    /**
     * 方法功能: 将两部分链表连接起来
     * 输入参数: 链表的假头结点
     */
    public static void reorder(Node head){
        if(head == null || head.next == null){
            return;
        }

        // 前半部分第一个链表结点
        Node cur1 = head.next;
        // 后半部分逆序的第一个链表结点
        Node mid = findMiddleNode(head.next);
        Node cur2 = reverseNode(mid);
        Node tmp = null;

        while(cur1.next != null){
            tmp = cur1.next;
            cur1.next = cur2;

            // 这里面只有cur1结点没用
            cur1 = tmp;

            tmp = cur2.next;
            cur2.next = cur1;
            cur2 = tmp;
        }
        cur1.next = cur2;
    }

    public static void main(String[] args) {
        // 假的头结点
        Node head = new Node(-1);
        Node cur = head;
        Node tmp = null;

        for(int i = 1; i < 8; i++){
            tmp = new Node(i);
            cur.next = tmp;
            cur = tmp;
        }

        System.out.println("排序前为:");

        for(cur = head.next; cur != null; cur = cur.next){
            System.out.print(cur.data + " ");
        }

        System.out.println("\n --------------------------------------------");
        System.out.println("排序后为:");
        Sort.reorder(head);
        for(cur = head.next; cur != null; cur = cur.next){
            System.out.print(cur.data + " ");
        }
    }
}

在这里插入图片描述

查找、逆序、合并的时间复杂度为O(n),n为链表的长度,空间复杂度为O(1)

3.解题思路

1.因为是单链表,所以只能往后移动,不能往前移动
2.所以找到中间结点,并且对后半部分进行逆序,然后合并前后两半部分。

4.一些自己的尝试

1.翻转链表
方法一:创建虚假链表头

class Node{
    int data;
    Node next = null;

    public Node(int data){
        this.data = data;
    }
}

public class LinkedListSort {
    public static Node reverseOrder(Node head){
    	if(head == null || head.next == null){
            return head;
        }
        // 创建一个假链表头,并指向head
        Node fakeNode = new Node(0);
        fakeNode.next = head;

        Node pre = head;
        Node cur = head.next;
        Node tmp1 = null;

        while(cur != null){
            pre.next = cur.next;
            tmp1 = fakeNode.next;
            fakeNode.next = cur;
            cur.next = tmp1;

            // 经过上次交换后,cur和pre已经交换位置
            cur = pre.next;
        }
        return fakeNode.next;
    }

    public static void main(String[] args) {
        Node head = new Node(1);
        Node fake = head;
        for(int i = 2; i < 7; i++){
            Node tmp = new Node(i);
            fake.next = tmp;
            fake = fake.next;
        }

        fake = LinkedListSort.reverseOrder(head);
        while(fake != null){
            System.out.print(fake.data + " ");
            fake = fake.next;
        }
    }
}

方法2:不带,就是
添加链接描述

安川机器人外部轴添加 本文详细介绍了如何在安川机器人本体上添加第7轴以及如何设置动作,本文以添加点焊枪为例进行讲解。 阅读详情

相关推荐

最优化方法 25:PDHG

前面的章节要么从原始问题出发,要么从对偶问题出发,通过求解近似点或者一个子优化问题进行迭代,而且推导过程中我们发现根据问题的参数特征,比如矩阵 AAA 是瘦高型的还是矮胖型的,采用对偶和原始问题的复杂度会不一样,可以选择一个更简单的。而这一节,我们将要从原始对偶问题出发来优化,什么是原始对偶问题呢?就是原始优化变量和对偶优化变量(原始函数和共轭函数)混合在一块,看下面的原理就知道了。 1. 原始对偶问题 现在考虑原始优化问题,其中 f,gf,gf,g 为闭凸函数 min⁡f(x)+g(Ax) \min \q

Glooow的博客 4604

链表:重新排列链表中的各节点【C语言,数据结构】(内含源代码)

设线性表L=(a1,a2,^,an-1,an)采用带头节点的单链表保存,设计并实现一个空间复杂度为O(1)且时间上尽可能高效的算法,重新排列L中的各结点,得到线性表L'=(a1,an,a2,an-1,a3,an-2……). 题目分析: 1.空间复杂度为O(1),这个意思是,我们不能用到的工具空间不能随着输入链表长度大小而改变,代表不能复制一个反向链表再插入,这种做法是不行的,这个要求代表,我们只能通过工具指针来进行本题的操作。 2.时间上尽可能高效,代表,我们的指针要尽可能的减少遍历链表的次数,这里要注

哦豁果奶的博客 1206

CH376S模块实战:如何通过串口轻松实现单片机与U盘的数据交互

本文详细介绍了如何利用CH376S模块,通过串口通信实现单片机与U盘的数据交互。文章从模块原理、硬件连接到核心指令集进行了全面解析,并提供了基于STM32的实战代码示例。CH376S模块极大地简化了USB协议和文件系统的复杂性,使开发者能快速为嵌入式设备添加便捷的数据存储与导出功能,适用于数据记录、配置导入等多种应用场景。

weixin_29165725的博客 458

代码随想录——重排链表

刷题总结

qq_39473176的博客 1069

STM32实战:如何用GPS信号同时同步海康摄像头和Livox Mid-360雷达(附完整接线图)

本文详细介绍了如何利用STM32实现GPS信号分频,同步海康摄像头和Livox Mid-360雷达的时间同步方案。通过硬件架构设计、STM32信号处理核心实现及设备接口规范,解决了多传感器数据融合中的时间对齐难题,适用于自动驾驶和机器人导航领域。

weixin_29182481的博客 596

g2o&PCL 四阶多项式拟合

g2o&PCL 四阶多项式拟合

dayuhaitang1的博客 142

高频笔试题一;逆序不带头结点的链表,不允许建立新链表

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、思路二、代码 前言 本科生在笔试面试的问的最多的就是链表,所以学习链表很重要 提示:以下是本篇文章正文内容,下面案例可供参考 一、思路 定义三个指针,用来一步步逆序。 二、代码 代码如下(示例): class Solution { public: ListNode* ReverseList(ListNode* pHead) { ListNode *pre = nullptr; ListNode *cur = pHead

QQ472589851的博客 455

使用手机录制rosbag包

使用手机作为便携式数据采集设备来录制rosbag。

weixin_38582851的博客 616

C++ 已知单链表L=(a1,a2,a3,…an).设计一个算法实现单链表的重新排列,即得到L‘=(a1,an,a2,an-1,a3,an-2…..)

C++ 已知单链表L=(a1,a2,a3,…an).设计一个算法实现单链表的重新排列,即得到L‘=(a1,an,a2,an-1,a3,an-2…..)

weixin_62717970的博客 1418

102、栅极驱动芯片选型与设计

文章摘要 本文分享了栅极驱动芯片选型与设计的实战经验。通过一次因驱动芯片选型不当导致的炸管事故,作者总结了栅极驱动芯片选型的五个关键参数:峰值驱动电流、驱动电压范围、传播延迟匹配、欠压锁定和隔离等级。文章详细分析了自举电路设计中的常见陷阱,以及栅极电阻对开关特性的影响,并强调了PCB布局布线的重要性。最后,作者提供了七条实用建议,包括避免通用型驱动芯片、关注CMTI参数、使用插件电阻等。核心观点是:栅极驱动设计需要综合考虑参数匹配、电路布局和实际调试,示波器实测波形是验证设计的唯一标准。

2401_88858637的博客 47

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

如何对链表进行重新排序

""" 给定链表L0-&gt;L1-&gt;L2...Ln-1-&gt;Ln, 把链表重新排序为L0-&gt;Ln-&gt;L1-&gt;Ln-1-&gt;L2...。要求:(1)在原来链表的基础上进行排序,既不能申请新的结点;(2)只能修改结点的next域,不能修改数据域 """ class LNode: def __init__(self): self.data

Chang_Shuang的博客 2386

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【每日一题】单链表重新排序,如给定 (1-> 2-> 3-> 4) 重新排序成 (1-> 4-> 2-> 3)

题目描述: 给定一个单链表 L: (L0->L1-> … -> Ln-1-> Ln),写出一个程序重新排序它,使它最后变成: (L0-> Ln-> L1-> Ln-1-> L2-> Ln-2-> …)。   例如:给定 (1-> 2-> 3-> 4) ,重新排序成 (1-> 4-> 2-> 3) struct Node { int val; Node* next; }; Node* reorderLi

Sunnyside_ 1217

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Python程序员面试算法宝典---解题总结: 第1章 链表 1.4 如何对链表进行重新排序

#!/usr/bin/env python # encoding: utf-8 ''' Python程序员面试算法宝典---解题总结: 第1章 链表 1.4 如何对链表进行重新排序 题目: 给定链表L0->L1->...Ln-1->Ln,把链表重新排序为L0->Ln->L1->Ln-1->L2->Ln-2...。 要求: (1) 在原来链表的基...

qingyuanluofeng的专栏 710

程序员面试算法宝典-1.4 如何对链表进行重新排序

题目描述: 给定链表L0->L1->L2...->Ln,把链表重新排序为L0->Ln->l1->Ln-1->L2->Ln-2...。要求:(1)在原来链表的基础上进行排序, 既不能申请新的结点;(2)只能修改结点的next域,不能修改数据域。 # 声明类结点 class LNode: def __init__(self): ...

博弈星宇 305

链表python笔试题目_python经典面试算法题1.4:如何对链表进行重新排序

本题目摘自《Python程序员面试算法宝典》,我会每天做一道这本书上的题目,并分享出来,统一放在我博客内,收集在一个分类中。1.4 对链表按照如下要求重新排序【微软笔试题】难度系数:⭐⭐⭐考察频率:⭐⭐⭐⭐题目描述:给定链表L0 -> L1 -> L2 -> … -> Ln-1 -> Ln ,把链表重新排序为 L0 -> Ln -> L1 -> L...

weixin_39717152的博客 246

20210716重排链表

题目描述 给定一个单链表L: L0→L1→…→Ln-1→Ln, 重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→… 必须在不改变节点值的情况下进行原地操作。 样例说明 样例 1: 输入: 1->2->3->4->null 输出: 1->4->2->3->null 样例 2: 输入: 1->2->3->4->5->null 输出: 1->5->2->4->...

qq_38680817的博客 118

143 重排链表 逆置法及其他思路

/** 给定一个单链表?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, 重新排列...

hhit_lyh的博客 280

(每日一练C++)CC8 重排链表

描述 将给定的单链表L\ LL: L0→L1→…→Ln−1→LnL_0→L_1→…→L_{n-1}→L_ nL0​→L1​→…→Ln−1​→Ln​ 重新排序为:L0→Ln→L1→Ln−1→L2→Ln−2→…L_0→L_n →L_1→L_{n-1}→L_2→L_{n-2}→…L0​→Ln​→L1​→Ln−1​→L2​→Ln−2​→… 要求使用原地算法,不能只改变节点内部的值,需要对实际的节点进行交换。 数据范围:链表长度 0≤n≤200000 \le n \le 200000≤n≤20000 ,链表中每..

m0_62396648的博客 223

143. Reorder List(重排链表)

题目链接:https://leetcode.com/problems/reorder-list/ Given a singly linked listL:L0→L1→…→Ln-1→Ln, reorder it to:L0→Ln→L1→Ln-1→L2→Ln-2→… You maynotmodify the values in the list's nodes, only nodes i...

God_Mood的博客 293

leetcode-143 重排链表

给定一个单链表 L 的头节点 head ,单链表 L 表示为: L0 → L1 → … → Ln - 1 → Ln 请将其重新排列后变为: L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → … 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reorder-list 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 输入:head = [1,2,3,4] 输出:[1,4,2,3] 构建一个 ta

zslngu的博客 808

leetcode--143重排链表

给定一个单链表 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-...

weixin_42640840的博客 259

7-2 Play with Linked List (25分)

Given a singly linked list L​1​​→L​2​​→⋯→L​n−1​​→L​n​​ and an integer 1≤k<n, you are supposed to rearrange the links to obtain a list like L​k​​→L​n​​→L​k−1​​→L​n−1​​→⋯. For example, given L being ...

qq_42347617的博客 3061

LeetCode 143. Reorder List

Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You may not modify the values in the list's nodes, only nodes itself may be changed. Example 1: Given 1->2-...

nicolelili1的专栏 109

【刷题】NC207 排序奇升偶降链表

【刷题】NC207 排序奇升偶降链表

LifeIsGood 362

奇偶链表(LeetCode)

题目链接 题目描述 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。 请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。 示例 1: 输入: 1->2->3->4->5->NULL 输出: 1->3->5->2->4->NULL 示例 2: 输入: 2->1->3->5-&g

weixin_44164489的博客 105

[LeetCode]88. Swap Nodes in Pairs链表成对逆序

Given a linked list, swap every two adjacent nodes and return its head. For example,Given1->2->3->4, you should return the list as2->1->4->3. Your algorithm should use only ...

diaobi8410的博客 73
上一篇: Cascaded Refinement Network for Point Cloud Completion 论文阅读
下一篇: 1.5将单链表向右旋转k个结点
念殊15
博客等级 码龄7年 17粉丝 177原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值