题目描述:
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。
解题思路:
创建两个新的链表:
big:这个链表中所有大于等于基准值的节点
small:这个链表中所有小于基准值的节点
基准值为4
把9和基准值4相比,9比基准值大:将9插入到big链表末尾
把5和基准值4相比,5比基准值大:将5插入到big链表末尾
把2和基准值4相比,2比基准值小:将2插入到small链表末尾
…
最后一步:
把两个链表首尾相连接:
smallTail.next=bigHead.next
代码实现:
public class Partition {
public ListNode partition(ListNode pHead, int x) {
if(pHead==null) {
return null;
}if(pHead.next==null) {
return pHead;
}
ListNode bigHead=new ListNode(-1);
ListNode bigTail=bigHead;
ListNode smallHead=new ListNode(-1);
ListNode smallTail=smallHead;
for(ListNode cur=pHead;cur!=null;cur=cur.next) {
if(cur.val<x) {
smallTail.next=new ListNode(cur.val);
smallTail=smallTail.next;
}else {
bigTail.next=new ListNode(cur.val);
bigTail=bigTail.next;
}
}
//将两个链表首尾相接
smallTail.next=bigHead.next;
return smallHead.next;
}
}
代码测试: