链表分割
编写代码,以给定值x
为基准将链表分割成两部分,所有小于x
的结点排在大于或等于x
的结点之前。
给定一个链表的头指针 Node Head
,x的值为分割基准数,请返回重新排列后的链表的头指针。
(注意:分割以后保持原来的数据顺序不变)
示例:
- 输入:
9->3->6->8->10
,x = 7
- 输出:3
->6->9->8->10
初始:初始化结点(指针),
cur指向头结点head,small ,smallLast,big,bigLast初始化为空,之后介绍其作用
Node cur = head;
Node small = null;
Node smallLast = null;
Node big = null;
Node bigLast = null;
解题思路
创建两条链表,小于给定值放入small指向的小链表的头结点,大于此给定值放入big指向的大链表的头结点,然后通过小链表的尾结点指针和big的头结点将两条链表合并起来。
判断极端条件,如果链表为空,既给定值也无法分割,直接返回空。
那么如果small指向的小链表为空?big指向的大链表为空?
small指向的小链表为空,排除本身链表为空的情况,说明只有big引导的大链表,return big
big指向的大链表为空,return small
————————————————————————————————————————————————————————
代码框架 (核心)
while (cur != null) {//while循环
if (cur.val < x) {//小链表
}
else {//大链表
}
cur = cur.next;//指针移动
}
链表如何处理
首先是图解法
大链表和小链表两者处理情况相同,先说明小链表的处理情况
小链表代码说明
if(cur.val<x)如何循环呢
首先走一遍,第一遍
small=cur;
smallLast=cur;
cur=cur.next;
第二遍
smallLast.next=cur;
smallLast=cur;
cur=cur.next;
if (cur.val < x) {
// 把 cur 尾插到 small
if (small == null) {
small = cur;
} else {
smallLast.next = cur;//smallLast标记small(头结点)引导的链表
}
smallLast = cur;
}
大小链表的处理
while (cur != null) {
if (cur.val < x) {
// 把 cur 尾插到 small
if (small == null) {
small = cur;
} else {
smallLast.next = cur;
}
smallLast = cur;
} else {
// 把 cur 尾插到 big
if (big == null) {
big = cur;
} else {
bigLast.next = cur;
}
bigLast = cur;
}
cur = cur.next;
}
特殊情况
if (smallLast == null) {
return big;//smallLast标记为空,返回大链表的头结点
} else {
smallLast.next = big;//正常情况小链表尾部指向大链表头结点
}
if (bigLast == null) {
return small;//没有比给定值大的结点,返回小链表的头结点
} else {
bigLast.next = null;
}
完整方法
private static Node separate(Node head, int x) {
Node cur = head;
Node small = null;
Node smallLast = null;
Node big = null;
Node bigLast = null;
while (cur != null) {
if (cur.val < x) {
// 把 cur 尾插到 small
if (small == null) {
small = cur;
} else {
smallLast.next = cur;
}
smallLast = cur;
} else {
// 把 cur 尾插到 big
if (big == null) {
big = cur;
} else {
bigLast.next = cur;
}
bigLast = cur;
}
cur = cur.next;
}
// 把 big 接到 small 的后边
if (smallLast == null) {
return big;
} else {
smallLast.next = big;
}
if (bigLast == null) {
return small;
} else {
bigLast.next = null;
}
return small;
}