题目描述
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
.
对于链表,除了前一篇<Reverse Linked List II>中说的设定一个front节点,这里还有一个技巧:随意的建立多个链表.这么说是因为建立一个新的链表只需要建立一个头元素,之后所做的事情无非就是把原来链表的元素根据条件移到不同的新链表中去.
那么针对这题,我们新开两个链表(其实就是头元素),分别表示比x小的链表以及比x大或者等于的链表,每次从原来链表上摘取一个ListNode,根据条件放到不同的链表中去,最后只要将两个链表头尾相连就好.
解题代码:
public ListNode partition(ListNode head, int x) {
ListNode p=new ListNode(0);//p指的是比x小的链表的最后一个元素
ListNode pFront=p;//pfront的下一个节点是比x小的链表的头元素.
ListNode q=new ListNode(0);//q指的是比x大的链表最后一个元素
ListNode qFront=q;//同理
ListNode r=new ListNode(0);//r用来遍历原链表
ListNode rFront=r;
r.next=head;//为了保持前驱节点,还是像之前所说的用r.next判断
while(r.next!=null)
{
if(r.next.val<x)//把r.next摘下来放到p后面,同时更新p
{
ListNode rnn=r.next.next;
r.next.next=p.next;
p.next=r.next;
p=p.next;
r.next=rnn;
}else//把r.next摘下来放到q后面,同时更新q
{
ListNode rnn=r.next.next;
r.next.next=q.next;
q.next=r.next;
q=q.next;
r.next=rnn;
}
}
p.next=qFront.next;//把p q头尾相连
return pFront.next;//返回p的头元素
}