面试题02.04分割链表

题目描述:

在这里插入图片描述

思路:

需要将一个链表分为两部分,前部分小于x,后部分大于x。并且节点之前的顺序不能变。所以每次向新链表添加时需要进行尾插法。分为两部分,值大于x的分为一部分,小于x的分为一部分。使用as,ae来表示大的那一部分的头和尾节点。使用bs,be来表示小的那一部分。使用中间变量cur来代替head遍历链表。当第一次插入节点时,使得bs/as=cur,并且be/ae=cur。非第一次插入则让be/ae.next=cur,be/ae=be/ae.next,be/ae始终保持在链表尾部。当所有的节点遍历完后,需要对bs进行判断,如果没有任何节点小于x,则返回as即可。注意:如果as不为空,需要将ae.next置为空,若ae.next不为空,可能造成死循环。
在这里插入图片描述

代码:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode partition(ListNode head, int x) {

            if(head==null){
                return null;
            }

            ListNode bs=null;
            ListNode be=null;
            ListNode as=null;
            ListNode ae=null;


            ListNode cur=head;


            while(cur!=null){
                if(cur.val<x){
                    if(bs==null){
                        bs=cur;
                        be=cur;
                    }else{
                        be.next=cur;
                        be=cur;
                    }
                    cur=cur.next;
                }else{
                    if(as==null){
                        as=cur;
                        ae=cur;
                    }else{
                        ae.next=cur;
                        ae=cur;
                    }
                    cur=cur.next;
                }
            }

            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、付费专栏及课程。

余额充值