问题描述
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. For example, Given 1->4->3->2->5->2
and x = 3
, return 1->2->2->4->3->5
. 地址
问题分析
该题是实现链表的Partition,将小于某一数字的节点放在前面,大于等于某一数字的节点放在后面。因为链表存取特性与数组不同,而且该题要求保证相对顺序,所以肯定不能用数组的Partition方法。 用额外空间:
遍历整个链表,将小于的存入一个新链表中(新建节点),大于等于的同样存入一个新链表中,然后将两条链表一串即可。 但显然这不是最优答案 不用额外空间,原地调整(推荐)
新建两个dummy节点 ,一个用作小于链表的头,一个用作大于链表的头(作用在于防止小于区或者大于区为空,那么无法找到头指针) 遍历链表,如果小于,那么连在小于链表的后面,并更新 小于链表的链尾指针;如果大于等于,连在大于等于链表的后面,并更新 大于链表的链尾指针 最后将两链表相连,并将大于区链尾指针的next置作null 即可。具体见实现。
经验教训
代码实现
/**
* 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 lessHead = new ListNode(0 );
ListNode lessTail = lessHead;
ListNode greatOrEqualHead = new ListNode(0 );
ListNode greatOrEqualTail = greatOrEqualHead;
ListNode curNode = head;
while (curNode != null ) {
if (curNode.val < x) {
lessTail.next = curNode;
lessTail = curNode;
}else {
greatOrEqualTail.next = curNode;
greatOrEqualTail = curNode;
}
curNode = curNode.next;
}
lessTail.next = greatOrEqualHead.next;
greatOrEqualTail.next = null ;
return lessHead.next;
}
}