题目链接
思路:
遍历链表,对链表进行分割,小于x的组成一条新链表,大于等于x的组成一条新链表
最后将两条链表连接在一起即可
public ListNode partition(ListNode head, int x) {
if (head == null || head.next == null) {
return head;
}
// 小于x的链表的头节点
ListNode lessHead = null;
// 小于x的链表的尾节点
ListNode lastLess = null;
// 大于等于x的链表的头节点
ListNode moreHead = null;
// 大于等于x的链表的尾节点
ListNode lastMore = null;
ListNode cur = head;
while (cur != null) {
if (cur.val < x) { // 当前节点值小于x
// 设置小于x的链表的头节点
lessHead = lessHead == null ? cur : lessHead;
// 设置小于x的链表的尾节点
lastLess = lastLess == null ? lessHead : lastLess;
// 若当前节点不是小于x的链表的头节点,则连接在尾节点后面,并更新尾节点
if (cur != lessHead) {
lastLess.next = cur;
lastLess = cur;
}
} else { // 当前节点值大于等于x
// 设置大于等于x的链表的头节点
moreHead = moreHead == null ? cur : moreHead;
// 设置大于等于x的链表的尾节点
lastMore = lastMore == null ? moreHead : lastMore;
// 若当前节点不是大于等于x的链表的头节点,则连接在尾节点后面,并更新尾节点
if (cur != moreHead) {
lastMore.next = cur;
lastMore = cur;
}
}
cur = cur.next;
}
// 存在小于x的节点时,需要连接大于等于x的链表
if (lastLess != null) {
lastLess.next = moreHead;
}
// 存在大于等于x的链表时,需要将尾节点的next指向null,防止出现环
if (lastMore != null) {
lastMore.next = null;
}
return lessHead == null ? moreHead : lessHead;
}
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}