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;
}
}