此题为力扣链表题目:
📌 文章目录:
题目:👇
1️⃣.题目解析
题目给定一个数字(比如10)要求比 10 小的数字都出现在大于等于 10 的数值前,这个数值(10)不一定出现在链表中,要求不能改变原来链表的相邻结点的初始相对位置,即初始时如果一个结点在另一个的右边(或者左边)移动后必须还是保持在其右边(或者左边)顺序不可以改变,这道题运用到需要运用到四个指针,运用分别记录位于给定数数值前的开始位置的:bs ,记录位于给定数数值前的结束位置的:be,记录位于给定数数值后的开始位置的:as,记录位于给定数数值后的结束位置的:ae,还有一个运用遍历链表的 cur ,进入循环先判断结点数值与给定数值的大小,再判断是不是第一次插入,结束循环后,分别判断前后两个位置是不是都有元素的插入
2️⃣.代码实现
步骤一、定义四个结点类型变量
ListNode bs = null;
ListNode be = null;
ListNode as = null;
ListNode ae = null;
步骤二、定义一个 cur 用于遍历数组
ListNode cur = head;
步骤三、进入循环进行数值大小的比较,如果是第一次插入元素,两个指针都指向该结点,如果不是第一次插入就执行插入操作,把满足要求的结点插入进来,循环结束条件为 cur 为空,即遍历完整个链表
if (cur.val < x){
if (bs == null){
be = cur;
bs = cur;
}
else{
be.next = cur;
be = be.next;
}
}
else{
if (as == null){
ae = cur;
as = cur;
}
else{
ae.next = cur;
ae = ae.next;
}
}
cur = cur.next;
}
步骤四、判断两个位置是不是都有结点,如果前面的位置没有元素,就把后半段的起始位置返回即(as),如果前半段有结点就,把前半部分和后半部分链接起来,再判断后半部分有没有结点,如果有就把后半部分的结束位置置空
if (bs == null){
return as;
}
be.next = as;
if (as != null){
ae.next = null;
}
步骤五、返回前半部分的起始位置
return bs;
3️⃣.全部代码
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode bs = null;
ListNode be = null;
ListNode as = null;
ListNode ae = null;
ListNode cur = head;
while(cur != null){
if (cur.val < x){
if (bs == null){
be = cur;
bs = cur;
}
else{
be.next = cur;
be = be.next;
}
}
else{
if (as == null){
ae = cur;
as = cur;
}
else{
ae.next = cur;
ae = ae.next;
}
}
cur = cur.next;
}
if (bs == null){
return as;
}
be.next = as;
if (as != null){
ae.next = null;
}
return bs;
}
}