Description:
Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.

You should preserve the original relative order of the nodes in each of the two partitions.

Example:

Input: head = 1->4->3->2->5->2, x = 3
Output: 1->2->2->4->3->5

题意:给定一个链表和一个值LeetCode-Partition List_指针变量,要求将链表中节点值小于LeetCode-Partition List_指针变量的那些节点排列在链表的首部,并且保持在原链表中的相对顺序;

解法:定义三个指针变量

  • p:指向排序后的链表的最后一个节点
  • head:用于遍历原链表
  • pre:指向head的前一个节点

我们遍历原链表,将所有节点值小于LeetCode-Partition List_指针变量的节点从原链表中删除,并插入到排序后的链表中;这里要注意的是不管是原链表还是排序后的链表,我们都是使用的同一个链表,并没有额外申请新的空间;

例如,对于链表​​head = 1->4->3->2->5->2, x = 3​​,其中vHead为虚拟头结点;

LeetCode-Partition List_指针变量_04

Java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode partition(ListNode head, int x) {
if (head == null || head.next == null) {
return head;
}

ListNode vHead = new ListNode(0);
vHead.next = head;
ListNode pre = vHead;
ListNode p = vHead;
while (head != null) {
if (head.val < x) {
if (p.next == head) {
p = p.next;
pre = pre.next;
head = head.next;
} else {
ListNode tempHead = head.next;
pre.next = head.next;
ListNode tempP = p.next;
p.next = head;
head.next = tempP;
p = head;
head = tempHead;
}
} else {
pre = pre.next;
head = head.next;
}
}

return vHead.next;
}
}