现有一链表的头指针 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;
标签:分割,ae,cur,1.2,链表,bs,null,节点
From: https://blog.csdn.net/kkksij/article/details/142472076