您的位置:首页 > 其它

LintCode Partition List 链表划分

2015-07-11 21:14 330 查看
中文版:

给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。

你应该保留两部分内链表节点原有的相对顺序。

样例

给定链表 1->4->3->2->5->2->null,并且 x=3

返回 1->2->2->4->3->5->null

English Version

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->null and x = 3,

return 1->2->2->4->3->5->null.

/**
* Definition for ListNode.
* public class ListNode {
*     int val;
*     ListNode next;
*     ListNode(int val) {
*         this.val = val;
*         this.next = null;
*     }
* }
*/
public class Solution {
/**
* @param head: The first node of linked list.
* @param x: an integer
* @return: a ListNode
*/
public ListNode partition(ListNode head, int x) {
if(null == head || head.next == null) return head;
ListNode node = new ListNode(Integer.MIN_VALUE);
node.next = head;
head = node;
ListNode p = head, q = head;
while(null != q && q.val < x){//找到大于等于x的节点
q = q.next;
}
if(null == q) return head.next;//所有节点值均小于x
while(p.next != q) {//p指向q的上一个节点
p = p.next;
}

while(null != q.next) {//q遍历链表,将值小于x的节点顺次移到p后面
if(q.next.val < x) {
ListNode l = q.next;
q.next = q.next.next;
l.next = p.next;
p.next = l;
p = p.next;
continue;
}
q = q.next;
}
return head.next;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: