JAVA-牛客网程序员面试宝典-链表分割

1.题目

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

2.分析

题目中出现一个分割链表的中间值x,通过与x对比进行链表分割,且不在意分割后的排序,
此问题可以看作将一个链表分成两组,再合并
首先需要定义两个空节点来作为两个子链表的表头,因此还需要定义三个指针节点,分别去遍历主链表和两个子链表
关键在于需要将不同的情况考虑进去
1.当给定链表为空
直接返回空
2.当给定链表只有一个节点
直接返回该节点
3.当给定的分割值比链表中所有值都大或者都小的时候
当比所有值都大的时候,所有的节点都被挂在第一个子链表上
需要将第二个子链表的头节点直接置为null;
当比所有值都小的时候,节点都挂在第二个子链表上
直接返回第二个子链表的头节点

3.代码示例

public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        if(pHead==null){
            return null;
        }else if(pHead.next==null){
            return pHead;
        }
        ListNode tmp1 =new ListNode(-1);
        ListNode ret1 = tmp1;
        ListNode tmp2 = new ListNode(-1);
        ListNode ret2 = tmp2;
        ListNode cur = pHead;
        while(cur!=null){
            if(cur.val<x){
                ret1.next=cur;
                ret1 = ret1.next;
            }else{
                ret2.next = cur;
                ret2=ret2.next;
            }
            cur = cur.next;
        }// write code here
        if(tmp2.next==null){
            ret2=null;
        }else {
            ret2.next=null;
        }
        
        ret1.next = tmp2.next;
        return tmp1.next;
    }
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值