链表分割 1.2版本

现有一链表的头指针 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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值