题目描述
编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
给定一个链表的头指针 ListNode* pHead,请返回重新排列后的链表的头指针。注意:分割以后保持原来的数据顺序不变。
解答如下:
import java.util.*;
/**
* 单向链表节点类
*/
class ListNode {
int val; //链表节点中的值
ListNode next = null; //下一个节点引用
ListNode(int val) {
this.val = val;
}
}
/**
* 算法实现类
*/
public class Partition {
public ListNode partition(ListNode pHead, int x) {
if(pHead!=null&&pHead.next==null)return pHead;
ListNode endNode = pHead;
int size = 1; //链表的节点个数
while(endNode.next!=null){
endNode = endNode.next;
size++;
}
ListNode startNode = pHead;
ListNode pointNode = null;
int j = 1; //遍历节点的计数器
while((startNode!=null)&&(j<=size)){
//头节点大于x的情况
if((startNode == pHead) && startNode.val>=x){
pHead = pHead.next;
endNode.next = startNode;
startNode.next = null;
endNode = endNode.next;
startNode = pHead;
pointNode = startNode;
j++;
}else if(startNode.val<x){ //节点小于x的处理方式
pointNode = startNode;
startNode = startNode.next;
j++;
}else if((startNode != pHead) && startNode.val>=x){ //非头节点大于x的情况
endNode.next = startNode;
pointNode.next = startNode.next;
startNode.next = null;
startNode = pointNode.next;
endNode = endNode.next;
j++;
}
}
return pHead;
}
}
算法学习,贵在坚持。
炼心问道,砥砺前行!