首页 > 其他分享 >链表分割 1.2版本

链表分割 1.2版本

时间:2024-09-28 17:18:36浏览次数:6  
标签:分割 ae cur 1.2 链表 bs null 节点

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

思路:

大致可以分为两个区域来存储数据:区域一存储小于36的节点,区域二存储大于36的节点.

可以将这两个区域视为两个链表,bs be(第一个链表的头节点和尾节点),as,ae(第二个链表的头节点和尾节点),待所有元素都尾插成功后,两个链表是否存在空链表的情况?将这些情况写入,同时,当第二个链表不为空时,将末节点置为null。(因为相当于一个大链表中的最后一个元素,要置为空)。

最后还有一个问题,将区域一的尾节点和区域二的尾节点连接起来即可。

                                           实现步骤

1.判断待尾插的值大小实现尾插功能

我们假设x的值为36,以下时待插入的元素

将这一组链表的头节点设为head,并将头节点赋给新创的节点cur,如何实现尾插呢?

尾插前,先判断节点cur的值与x的大小关系如果cur的值<x,则将其放到区域1,也就是bs,be,在我们放入之前,我们要判断这个链表是不是第一次插入元素,即判断bs(头节点)是否为空,为空,那就将cur节点赋给bs与be(第一次插入,头节点即为尾节点),同时cur要指向下一个节点,若不是第一次插入,例如下图,插入23时,就将be(尾节点)的下一个节点赋给cur节点,同时更新be到下一个节点。

若cur的值>x,跟上方一样,判断其是否为空(第一次插入),那若

不为空,将ae的下一个节点指向待插入节点cur,同时更新ae的位置和cur的位置

具体代码如下:

public ListNode partition(ListNode pHead, int x) {
        // write code here
        ListNode bs = null;
        ListNode be = null;
        ListNode as = null;
        ListNode ae = null;
        ListNode cur = pHead;
        while( cur!= null )
        {
            if(cur.val < x){
                if(bs == null){
                    bs = be = cur;
                }else{
                    be.next = cur;
                    be = be.next;
                }
            }else{
                if(as == null){
                    as = ae = cur;
                }else{
                    ae.next = cur;
                    ae = ae.next;
                }
            }    
            cur = cur.next;           
        }
        


2.尾插成功后,判断是否有链表为空:

 如果尾插结束后仍有一个链表为空(没有对应的符合x的值),则返回另一个链表。

3.将尾插后的两个链表通过be(尾节点)和as(头节点)连接起来组成一个完整的大链表。

4.如果区域二的链表不为空,那其尾节点应该置为空(作为整个大链表中的尾节点)。

具体代码如下:


           if(bs == null){
            return as;
           }
           be.next = as;
           if(as!=null){
            ae.next = null;
           
}
return bs;

标签:分割,ae,cur,1.2,链表,bs,null,节点
From: https://blog.csdn.net/kkksij/article/details/142472076

相关文章

  • 算法训练营第三天| 203.移除链表元素、707.设计链表、206.反转链表
    203.移除链表元素状态:完成个人思路:首先令head符合条件,之后判断这个head是否为空,空的话返回空节点;非空的话继续进行。令pre=head;cur=head->next,只要cur非空,就判断cur的值的情况,如果需要删除,就改变pre->next和cur;如果不需要删除就继续检查下一个。看完讲解视频之后的想法:我......
  • 代码随想录算法训练营第三天 | 熟悉链表
    链表的存储方式数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。链表是通过指针域的指针链接在内存中各个节点。所以链表中的节点在内存中不是连续分布的,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。链表的定义template<typenameT>......
  • 力扣 简单 206.反转链表
    文章目录题目介绍题解题目介绍题解法一:双指针在遍历链表时,将当前节点的next改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。代码如下:classSolution{public......
  • 力扣 中等 92.反转链表 II
    文章目录题目介绍题解题目介绍题解classSolution{publicListNodereverseBetween(ListNodehead,intleft,intright){//创建一个哑节点,它的next指向头节点,方便处理ListNodedummy=newListNode(0,head);//p0用于......
  • 算法题:用队列实现一个链表
    下面是添加了注释的ListNode类和LinkedListQueue类,以帮助理解每个部分的功能和目的://定义链表节点类,用于存储队列中的元素classListNode{intval;//存储节点的值ListNodenext;//指向下一个节点的指针//构造函数,用于创建新的节点ListNod......
  • 19. 删除链表的倒数第 N 个结点
    相当于删除正数第n个节点classSolution{public:ListNode*removeNthFromEnd(ListNode*head,intn){if(!head)returnhead;intlistLength=0;ListNode*temp=head;while(temp){temp=temp->next;......
  • 基于Java+Springboot+Vue开发的医院门诊预约挂号系统源码+参考文章1.2万字
    项目简介该项目是基于Java+Springboot+Vue开发的医院门诊预约挂号系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的门诊预约挂号管理系统项目,大学生可以在实践......
  • 使用双向链表和哈希表实现LRU缓存
    在日常开发中,缓存是一个非常常见且重要的技术手段,能够显著提升系统性能。为了保证缓存的有效性,需要实现一种机制,在缓存空间不足时,能够自动淘汰最久未被使用的数据。这种机制就是**LRU(LeastRecentlyUsed,最近最少使用)**算法。一、LRU缓存的原理LRU是一种常用的缓存淘汰策......
  • 环形链表的约瑟夫问题
    一:题目二:思路前提:该题已经声明了结构体,只是看不见,声明如下:因为是从0开始实现:1:创建一个n个节点的循环链表,其值为1~n(假设n=5)如图:代码如下: structListNode*newnode=(structListNode*)malloc(sizeof(structListNode)); if(newnode==NULL) { perror("mal......
  • 数据结构编程实践20讲(Python版)—02链表
    本文目录02链表linked-listS1说明S2示例单向链表双向链表循环链表S3问题:反转单向链表求解思路Python3程序S4问题:双向链表实现历史浏览网页求解思路Python3程序S5问题:基于循环链表的玩家出牌顺序求解思路Python3程序往期链接01数组02链表linked-lis......