问题描述:
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。
分析:
定义四个新的节点,分别用来做头插和尾插。
定义一个节点,他指向给定节点的头指针。再用两个节点 s, sl 分别作为小于 x 的节点的头指针和尾指针,同样,再用两个节点 b , bl 分别作为小于 x 的节点的头指针和尾指针。
当遍历节点cur时,有几种情况需要注意:
1. 节点的val值小于X
1)头指针的头结点为空
头指针的头节点s指向这个节点 ,即 s= cur。
2)头指针的头节点不为空
头指针的尾节点的next(sl.next)指向这个节点 ,即 sl.next = cur , sl = cur;
2.节点的val值大于X
1) 尾指针的头结点为空
尾指针的头结点b指向这个节点 ,即b = cur;
2)尾指针的头结点不为空
尾指针的尾结点的next(bl.next)指向这个节点 ,即 bl.next = cur , bl = cur;
当执行完循环体后,还需要再分别判断头指针和尾指针是否为空。
1.头指针为空,那就直接输出尾指针。
2.头指针不为空
1)尾指针的头结点为空
那么就直接输出头指针
2)尾指针的头结点不为空
头指针的尾节点的next(sl.next)指向 尾指针的头结点,即 sl.next = b
尾指针的尾节点的next指向null,即 bl.next = null
import java.util.*;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Partition {
public ListNode partition(ListNode pHead, int x) {
ListNode cur = pHead;
ListNode s = null;
ListNode sl = null;
ListNode b = null;
ListNode bl = null;
while(cur != null){
if(cur.val < x){
if(s == null){
s = cur;
}else{
sl.next = cur;
}
sl = cur;
}else{
if(b == null){
b = cur;
}else{
bl.next = cur;
}
bl = cur;
}
cur = cur.next;
}
if(s == null){
return b;
}else{
sl.next = b;
if(bl!= null){
bl.next = null;
}
}
return s;
}
}