题目描述:编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。
- 示例:2->4->1->5->9->3->6->null, x = 5
- 输出:2->4->1->3->5->9->6->null
思路:定义两个新链表,一个存储比 x 值小的结点,另一个存储大于等于 x 的值的结点,最后将两个链表连接起来。
注意:
- 如果分割后前一个链表为 null,直接返回后一个链表。
- 如果分割后后一个链表为 null,直接返回前一个链表。后一个链表不为空,则返回连接后的链表。
public class Partition {
public ListNode partition(ListNode pHead, int x) {
/*
遍历整个链表,把小于 x 的尾插到一个小链表
把大于等于 x 的尾插到一个大链表中
理想情况下,把大链表接到小链表后边
1) 如果没有小链表,直接返回大链表(大链表可能为空)
保证,返回链表的最后一个结点.next == null
lessLast / greatLast
*/
/* 尾插
1. 先情况讨论:
1)如果当前链表为空,要插入的结点就是链表的第一个结点
2) 如果链表不为空,
1. 先找到当前的最后一个结点
2. 让当前的最后一个结点的 next = 要插入的结点
3. 如果每次的最后一个结点都是我们插入的
可以记录上次插入的最后一个结点
4. 不要忘记更新最后一个结点
*/
ListNode before = null;
ListNode after = null;
ListNode last1 = null;
ListNode last2 = null;
ListNode cur = pHead;
while(cur != null){
if(cur.val < x){
if(before == null){
before = cur;
}else{
last1.next = cur;
}
last1 = cur;
}else{
if(after == null){
after = cur;
}else{
last2.next = cur;
}
last2 = cur;
}
cur = cur.next;
}
if(before == null){
return after;
}else{
last1.next = after;
if(after != null){
last2.next = null;
}
return before;
}
}
}