牛客网---链表分割

编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前。
给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。
对于这个题:思路是:
先将原链表数据分为2个集合,一个是小于x的集合l1,另一个是大于等于x的集合l2,只是把数据放进数组,并不排序,然后把l2中数据添加在集合l1后面,这样就完成小于x的数据排在大于等于x的数据之前。最后一步是将集合l1中数据依次替换到链表数据,返回头结点。
代码如下:

import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        //将原链表分为两个集合
        //小于x的集合和大于等于x的集合
        ArrayList<Integer> l1=new ArrayList<>();  //动态整型数组
        ArrayList<Integer> l2=new ArrayList<>();
        ListNode cur=pHead;
        while(cur!=null)
        {
            if(cur.val<x)
                l1.add(cur.val);  //小的元素方l1集合
            else
                l2.add(cur.val);  //大的元素方l2集合
            cur=cur.next;
        }
        l1.addAll(l2);//把集合l2的元素添加在集合l1后面
        //将链表中数据按照集合l1顺序进行替换
        pHead.val=l1.get(0);
        cur=pHead.next;
        for(int i=1;i<l1.size();i++)
        {
            cur.val=l1.get(i);
            cur=cur.next;         
        }
        return pHead;
    }
}

猜你喜欢

转载自blog.csdn.net/sophia__yu/article/details/83796104