问题:
编写代码,以给定值x为基准将链表分割为两部分,所有小于x的节点排在大于或等于x的节点之前。
给定一个链表的头指针 ListNode pHead,请返回重新排列后的链表的头指针。
注意:分割以后保持原来的数据顺序不变
不要开辟新的空间,既不要新建节点
图解:
代码
package LianBiao;
/*
* 声明四个结点分别存储小于基准值,
* 大于或等于基准值(注意这里是声明结点,不是实例化结点,所以不算违规)*/
public class 基准值分区 {
private static class ListNode{
private ListNode next;
private int value;
public ListNode(int value) {
this.value = value;
}
}
public static void main(String[] args) {
int arr[] = {5, 6, 3, 1, 2, 8};
ListNode head = new ListNode(arr[0]);
//创建链表
ListNode p = head;
for(int i = 1; i < arr.length; i++){
p.next = new ListNode(arr[i]);
p = p.next;
}
//输出链表
p = head;
while(p != null){
System.out.print(p.value + " ");
p = p.next;
}
System.out.print("\n");
int n = 7;
//调用方法
ListNode node = partition(head, n);
while(node != null){
System.out.print(node.value + " ");
node = node.next;
}
}
private static ListNode partition(ListNode head, int n) {
ListNode p = head;
//定义左侧链表
ListNode leftFirst = null;
ListNode leftTail = null;
//定义右侧链表
ListNode rightFirst = null;
ListNode rightTail = null;
//顺序扫描所有节点
while(p != null){
if(p.value < n){ //小于x
if(leftFirst == null){
leftFirst = p;
leftTail = p;
}else{ //如果不是第一个元素
leftTail.next = p;
leftTail = leftTail.next;
}
}else{ //大于x
if(rightFirst == null){ //说明是右边的第一个元素
rightFirst = p;
rightTail = p;
}else{ //如果不是第一个元素
rightTail.next = p;
rightTail = rightTail.next;
}
}
p = p.next; //指针后移
}
//判断左边的链表是否为空
if(leftFirst == null){
return rightFirst;
}
//否则,左右链表连接
leftTail.next = rightFirst;
//一定要写上下面的if判断语句假如不写会出现错误
if (rightTail != null) rightTail.next = null;
return leftFirst;
}
}