【算法刷题】链表笔试题解析(1)

一、链表分割

题目描述:

链接:链表分割

d908ed776515446ba1ee0ca64e55793b.png

题目分析:

        这题直接处理并不好做,我们可以构建前后两个链表,将小于x值的结点放在链表a内,将其它结点放在链表b内,这样将原链表遍历完后,原链表就自然地分成了两部分,最后将两个链表拼接起来就行了。

如果你以为这题到这里就完了,那这题就不会被分在“较难题”里了

        做算法题,我们一定要细心,要考虑好程序可能会面临的所有情况,仔细梳理一下,你会发现这道题主要会有四种情况:

1、给定链表为空

2、链表中的值有大于x的,也有小于x的

3、链表中所有结点的值都大于x

4、链表中所有节点的值都小于x

这时问题就很明显了,我们之前的思路只能处理第二种情况,遇到其它情况的时候就会出现问题。

比如在第三种情况下,由于没有小于x的结点,所以链表a的头尾指针都不能指向具体的结点,这时如果再通过a链表的尾节点指向b链表的方式链接,就会出现空指针异常导致程序出错了

因此我们还需要分别处理其它三种情况:

1、因为链表为空,所以不需要处理,直接返回头结点即可

3、此时a链表的头指针应该为空,只需要返回b链表的头结点即可

4、此时b链表为空,正常让a的尾结点指向b的头,直接返回头结点即可

注意:二三种情况时需要将b的尾结点的后驱结点置空,这样才能构建一个正常的单链表


代码实现:

public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        // write code here
        if(pHead==null){
            return pHead;
        }
        ListNode as=null;
        ListNode ae=null;
        ListNode bs=null;
        ListN
评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值