【数据结构】设一个带头结点的单链表L,大部分元素为正数,少数为负数,编写函数,采用高效的算法调整链表,实现将负数结点移到链表尾部,并返回调整后链表中第一个负数结点的位置。

用顺序表、单链表将负数移动到其他元素前面 1、 有一个整数顺序表L,设计一个尽可能高效的算法将所有负整数的元素移到其他元素的前面,并给出算法的时间和空间复杂度。例如,L=(1,2,-1,-2,3,-3,4),移动后L=(-1,-2,-3,2,3,1,4)。例如,L=(1,2,-1,-2,3,-3,4),移动后L=(-1,-2,-3,1,2,3,4)。 阅读详情

1. 算法思路

使用尾插法实现该要求。实现按步骤为:

  • 定义工作指针tail和minus,分别指向正数的最后一个结点以及负数的头结点。
  • 循环遍历链表,将结点使用尾插法插入正结点的末尾。
  • 如果插入的是正结点,则移动tail;如果是负结点,则移动minus。

2.定义结构体

typedef struct LNode {
    int data;
    struct LNode *next;
} LNode, *LinkList;

3.函数实现

定义工作指针:

  • p: 用于遍历单链表
  • tail: 指向正数结点的尾部
  • minus: 指向负数结点的头部,初始值为NULL
  • s: 用于暂时指向当前p结点

循环遍历A链表,使用p指针指向当前结点,判断当前的正负:

  • p->data >= 0: 当前结点为正数,将其插入到正数的最后面,然后修改tail指针指向该结点,此时tail仍指向正数的尾结点,minus指向负数的头结点;
  • p->data < 0: 当前结点为负数,将其插入到正数的最后面,即负数的最前面,然后移动minus指针到当前指针,此时tail仍指向正数的尾结点,minus指向负数的头结点。
  • 重复上述步骤直到遍历完成。此时返回负数的头结点minus,然后可遍历输出查看负数结点。
LNode* SortList(LinkList A) {
    LNode *p, *tail = A, *minus = NULL,*s = NULL;
    if(!A) {
        return NULL;
    }
    p = A->next;
    while(p) {
        tail->next = p;
        s = p;
        p = p->next;
        s->next = minus;
        if(s->data >= 0) {//非负数,移动tail指针
            tail = s;
        } else {//负数
            minus = s;
        }
    }
    return minus;
}

4.测试结果

LinkList A = (LinkList)malloc(sizeof(LNode));
int a[] = {1, 2, -4, 3, 4, -1, 7, -3};

在这里插入图片描述

5.完整代码

#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 20 

//定义结构体
typedef struct LNode {
    int data;
    struct LNode *next;
} LNode, *LinkList;

LNode* SortList(LinkList A) {
    LNode *p, *tail = A, *minus = NULL,*s = NULL;
    if(!A) {
        return NULL;
    }
    p = A->next;
    while(p) {
        tail->next = p;
        s = p;
        p = p->next;
        s->next = minus;
        if(s->data >= 0) {//非负数,移动tail指针
            tail = s;
        } else {//负数
            minus = s;
        }
    }
    return minus;
}

int main() {
    //创建单链表
    LinkList A = (LinkList)malloc(sizeof(LNode));
    int a[] = {1, 2, -4, 3, 4, -1, 7, -3};
    LNode *s = NULL;
    LNode *tail = A;//tail指向尾结点
    //循环创建链表
    for(int i=0; i < sizeof(a) / sizeof(a[0]); i++) {
        s = (LNode *)malloc(sizeof(LNode));//创建新结点
        s->data = a[i];
        s->next = NULL;
        tail->next = s;
        tail = tail->next;
    }
    LinkList p = A->next;
    //打印查看原始数据
    printf("A链表的数据为:\n");
    while(p) {
        printf("%d\t", p->data);
        p = p->next;
    }
    printf("\n");
    LNode *q = SortList(A);
    printf("负数序列为:\n");
    while(q) {
        printf("%d\t", q->data);
        q = q->next;
    }
    p = A->next;
    printf("\n修改后A链表的数据为:\n");
    while(p) {
        printf("%d\t", p->data);
        p = p->next;
    }
    return 0;
}

数据结构第1~2章练习答案(PTA) an )用一维数组表示,假定删除线性表中任一元素的概率相同(都为1/n),则删除一个元素平均需要移动元素的个数是(2-18将两个结点数都为N且都从小到大有序的单向链表合并成一个从小到大有序的单向链表,那么可能的最少比较次数是(A.访问第i个结点(1≤i≤N)和求第i个结点的直接前驱(2≤i≤N)2-12在单链表指针为p的结点之后插入指针为s的结点,正确的操作是(D.顺序表的特点是:逻辑上相邻的元素,存储在物理位置也相邻的单元中。2-8在N个结点的顺序表中,算法的时间复杂度为O(1)的操作是( 阅读详情

相关推荐

C# C++ 笔记

变量自定义赋值​# 变量取值用$()​​​​​​clean:多个程序员分发同一程序时,由于不能直接在一个程序上进行功能的开发,所以就有了功能分支的概念。二维数组可以理解为是存储指针的一维数组,里面的每一个指针都指向一个一维数组的首地址存储多个一维数组的数据结构。array 是一个二维数组,它有3行和4列,总共可以存储12个整数。

AVICCI的博客 2201

设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结点(链表A中的元素为非零整数,要求B、C表利用A表的结点)。

#include<iostream> #include<string> #include<iomanip> #include<fstream> using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。 typedef int ElemType; //ElemType 为可定义的.

SunCherryDream的专栏 1400

思科校招笔试C语言核心考点解析:从指针到内存管理

C语言作为底层系统开发的核心语言,其指针、数组与内存管理机制是衡量工程师基本功的重要标准。指针运算直接反映对内存布局的理解,而数组名与指针的微妙关系、堆栈差异、字节对齐等概念,则决定了代码在真实硬件环境下的稳定性与性能。在嵌入式网络设备、通信协议解析及高性能服务端场景中,这些知识不仅是笔试考点,更是生产环境规避内存泄漏、越界访问等重大事故的必备技能。strcpy的实现细节、sizeof与strlen的本质区别、结构体对齐优化等经典问题,能够系统检验开发者对编译原理与运行时内存模型的认知深度。本文围绕思科校园

weixin_34117211的博客 409

数据结构:假设有一个带头结点的单链表L,每个结点值由单个数字、小写字母和大写字母构成。设计一个算法将其拆分成3个带头结点的单链表L1、L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母

假设有一个带头结点的单链表L,每个结点值由单个数字、小写字母和大写字母构成。设计一个算法将其拆分成3个带头结点的单链表L1、L2和L3,L1包含L中的所有数字结点,L2包含L中的所有小写字母结点,L3包含L中的所有大写字母结点。c语言

qq_61959524的博客 6117

【真题2018-4】一带头结点的单链表L(int),大部分为正数,少部分为负数,编写函数采用高效的算法调整链表,实现将负数移到链表尾部,并返回第一个负数的结点位置。

真题

CS GO 759

LeetCode 热题 100 回顾

力扣最受刷题发烧友欢迎的 100 道题 LeetCode 热题 100 : 题目回顾、解题思路、复杂度分析、代码实现、验证算法

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 9万+

数据结构代码题合集

用顺序表最后一个元素覆盖整个顺序表中最小元素,并返回该最小元素 将顺序表的元素逆置 将a1,a2,a3……am b1,b2,b3……bn转换成b1,b2,b3……bn a1,a2,a3……am 删除顺序表中所有值为x的元素 从顺序表中删除给定值再s到t之间(包括s和t)的所有元素 删除有序表中所有值重复的元素 删除有序表中所有值重复的元素 将两个递增有序表 合并为 一个递增有序表 求两个递增序列的中位数 设计一个时间上尽可能高效的算法,找出数组中未出现的最小正整数 若一个整数序列中有过半

m0_69093426的博客 908

LeetCode 面试经典 150 题回顾

最经典 150 题,掌握面试所有知识点 面试经典 150 题 : 题目分析、解题思路、复杂度分析、代码展示

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 8万+

2010年之前南航数据结构线性表真题

(2018)设一个带头结点的单链表L,数据元素为整数,其中大部分为正数,少数为负数,编写函数,采用高效的算法调整链表,实现负结点移到链表的尾部,并返回调整后链表中的第一个负数节点位置。先给出算法思想,再写出相应的代码。(和王道上的题目类似) 。 (2003)设有一个线性表,存放在一维数组a[0,…n-1]中,编程将数组中每一个元素循环右移k位,要求只用一个辅助单元,时间复杂度为O(n)。(王道中有...

qq_32734639的博客 964

UE4入门实例17(Unreal制作卡通Post Process材质球)

效果展示 #1 创建Post Porcess材质球 #2 编写Shader功能 #3 设置场景区域内风格化渲染 #1 创建Post Porcess材质球 #2 编写Shader功能 创建基础效果 移除现有通道渲染 设置视图渲染范围 #3 设置场景区域内风格化渲染 #4 加群下载Shader源码:284105567 ...

Unity3d 攻城师一枚 1345

ANSYS APDL学习(6):ANSYS APDL部分命令流介绍

介绍APDL 部分命令流

娱乐至上的博客 1万+

408数据结构算法模板全攻略:高频考点与代码骨架

数据结构是计算机科学的核心基础,其算法设计与实现能力直接反映工程师的抽象思维与工程素养。在各类笔试与考研中,数据结构代码题往往成为拉分关键。针对这一痛点,业内形成了一套行之有效的“模板化”训练方法——将高频算法提炼为固定骨架,通过参数调整适应不同题型。该方法的本质在于先记忆核心操作框架,再结合边界条件与具体逻辑灵活变通,从而在有限时间内稳定输出高质量代码。实践表明,这种模式不仅适用于408考研的大题冲刺,也可迁移至技术面试和日常编码。本文系统梳理了顺序表、链表、二叉树及图等核心结构的算法模板,并结合阅卷评分

weixin_34121282的博客 380

RDP Wrapper失效了?别慌!教你如何手动为Windows 10/11最新版本添加rdpwrap.ini配置

本文详细介绍了当RDP Wrapper在Windows 10/11最新版本中失效时,如何手动添加rdpwrap.ini配置以恢复多用户远程桌面功能。通过获取最新配置文件、安全替换配置的完整流程以及高级手动配置技巧,帮助用户解决[Not support]问题,确保远程工作流程不受系统更新影响。

weixin_30765577的博客 624

力扣100题解(1)

的输入如下(你设计的程序。

Yuking_Go的博客 163

超详细 VMware Horizon 虚拟桌面VDI安装步骤

主要的目的是模拟生产环境中的共享存储。自动桌面相当于共享电脑,大家使用同一个虚拟机,对虚拟机的修改都放在用户的配置文件中,RDS桌面池相当于共享的服务器,可以多人同时连接到服务器上。1:之前已经建立好了NFS的存储,这部分配置好后,以后的虚拟机可以安装到NFS的存储中。2: 使用Composer发布系统可以解决SID,机器名冲突的问题,更重要的可以节约磁盘空间,发布的所有系统可以访问一块磁盘。26: 域选择我们之前建立的域,用户名我输入的是管理员,可以在AD域新建用户点击查找,我这里用的是管理员。

vv12345的博客 1万+

西门子S7-200 SMART控制步进电机(二)

目录 一、开环运动控制方法 二、运动轴概述 三、配置运动控制向导 一、开环运动控制方法 S7-200 SMART CPU提供三种开环运动控制的方法: 1、脉冲宽度调制(PWM):内置于CPU中,用于速度、位置或占空比的控制 2、脉冲串输出(PTO):内置于CPU中,用于指定长度脉冲或指定距离的控制 3、运动轴:内置于CPU总,用于速度和位置的控制。本文所讲的就是通过运动轴实现步进电机的运动控制。 SR20和ST20 CP...

qq_43134642的博客 2万+

链表面试重头戏:虚拟头节点与双指针实战精讲

链表是数据结构面试中绕不开的基础考点,其指针操作的灵活性既是难点也是进阶的关键。面对涉及增删改查的链表题目,虚拟头节点(dummy node)能有效统一头节点的处理逻辑,避免边界条件纷扰;而双指针技术则是解决倒数节点查找、链表相交等问题的经典手段,可将时间复杂度优化至O(n)。理解指针指向变化的本质,掌握快慢指针的运动规律,往往是破解链表面试题的突破口。四道高频题目分别覆盖了虚拟头节点、双指针、哈希表与数学推导,几乎囊括了链表核心技能树。无论校招还是社招,扎实掌握这些基础技巧,并能在LeetCode上手写代

weixin_33423874的博客 233

OpenClaw 股票自动化交易实践指南:从原理到实战的完整技术路径

量化交易策略的开发是一个系统工程,需要综合运用金融知识、编程技能和数据分析能力。OpenClaw通过引入提示词工程技术,大大降低了策略开发的技术门槛,使得更多投资者能够参与到量化交易中来。但技术只是工具,真正决定策略成败的是对市场的深刻理解和严格的风险管理。本章系统介绍了OpenClaw环境下的策略开发方法,从提示词驱动到传统代码实现,从参数优化到回测验证,涵盖了策略开发的完整流程。提示词驱动方式适合快速验证交易想法,传统代码方式适合实现复杂的定制逻辑,两种方式可以协同使用,发挥各自的优势。

lovely_yoshino的博客 5989

LeetCode Hot100

LeetCode #1 · Two Sum给定一个整数数组 和一个整数目标值 ,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。示例 1: 示例 2: 示例 3: 提示:只会存在一个有效答案进阶:你可以想出一个时间复杂度小于 的算法吗? 个人解析 返回目录LeetCode #49 · Group Anagrams给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结

m0_68856756的博客 249

基于STM32的多功能旅行箱_329

随着智能硬件技术的不断发展,智能化产品逐渐渗透到日常生活的各个领域。旅行箱作为出行必需的工具,其传统功能已无法满足现代用户的需求,尤其是在安全性、便捷性和智能交互方面。为了解决这一问题,本设计基于STM32单片机开发了一款多功能智能旅行箱,集成了移动防盗报警、语音寻箱、GPS定位、称重检测、手势控制和蓝牙通信等多项功能。通过STM32F103RCT6主控芯片与HC-05蓝牙模块进行通信,结合海凌科V20语音识别模块、ATGM336H-5N GPS模块和HX711称重模块,提供了全方位的智能化体验。

483

手把手教你学simulink实例--基于Simulink的储能系统性能评估与仿真

储能系统是现代能源体系中的关键组成部分,广泛应用于可再生能源并网、电网调峰调频、电力质量改善以及电动汽车充电等领域。为了提高储能系统的运行效率和可靠性,对其性能进行准确评估至关重要。基于MATLAB/Simulink平台,可以构建储能系统的动态模型,并通过仿真分析其在不同工况下的性能表现。本项目旨在研究储能系统的建模方法、控制策略及其性能评估指标,并通过Simulink仿真验证系统的动态特性和稳态性能。

MHD0815的博客 194

Java 集合

集合

蔡林浩的博客 572

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

嵌软编程刷题记录

并且活动主持人需要全程参与活动,换句话说,一个主持人参与了第 i 个活动,那么该主持人在 (有 n 个活动即将举办,每个活动都有开始时间与活动的结束时间,第 i 个活动的开始时间是。求为了成功举办这 n 个活动,最少需要多少名主持人。2. 任意两个相邻的孩子之间,得分较多的孩子必须拿多一些糖果。复杂度要求:时间复杂度O(nlogn) ,空间复杂度 O(n)要求: 时间复杂度为O(n) 空间复杂度为 O(n),举办某个活动就需要为该活动准备一个活动主持人。输入:2,[[1,2],[2,3]]

2302_79514441的博客 370

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

将所有负数移动到开头所有正数移到结尾

题目 给定一个整数数组 nums,数组中有正数也有负数,将负数移动到开头,正数移动到结尾 要求:一次遍历。 示例: 给定 nums = [-2, -7,5,9,-10, 11, -15] 返回 [-2, -7, -10, -15, 5, 11, 9] 解题思路 设置一个进位值j,来保存一个正数的值,跟随i进行遍历移动,当出现nums[i]小于0时,0也就是分水岭,进行nums[i]与nums[j]置换。 这里使用了 快速置换的方法 [a,b]=[b,a]; ES6的新方法 省去了设置temp的中间值

破茧 1989

数据结构与算法之单链表

链表链表的介绍单链表(带头节点)添加(创建) 链表的介绍 链表是有序的列表,它在内存中的存储如下 链表是以节点的方式来存储,是链式存储 每个节点包含data域,next域:指向下一个节点 如图: 发现链表的个个节点不一定是连续存储 链表分带头节点的链表和没有头结点的链表,根据需求来确定 单链表(带头节点) 使用一个带head头的单向链表实现排行榜管理 完成对英雄人物的增删改查操作 ...

Happy_Boy_z的博客 1094
上一篇: 【数据结构】A、B为递减有序的单链表,编写函数,将它们合并成递增有序的单链表,相同元素值只保留一个结点
下一篇: 【数据结构】设有一家谱树,使用孩子兄弟(二叉链表)表示,编写函数,输出家谱中有多少代以及最后一代人数和成员名字
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天进步一点丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值