LeetCode-Partition List
原创
©著作权归作者所有:来自51CTO博客作者BeHelium的原创作品,请联系作者获取转载授权,否则将追究法律责任
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
题意:给定一个链表和一个值,要求将链表中节点值小于的那些节点排列在链表的首部,并且保持在原链表中的相对顺序;
解法:定义三个指针变量
- p:指向排序后的链表的最后一个节点
- head:用于遍历原链表
- pre:指向head的前一个节点
我们遍历原链表,将所有节点值小于的节点从原链表中删除,并插入到排序后的链表中;这里要注意的是不管是原链表还是排序后的链表,我们都是使用的同一个链表,并没有额外申请新的空间;
例如,对于链表head = 1->4->3->2->5->2, x = 3
,其中vHead为虚拟头结点;
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;
}
}