原题: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
.
给一个链表,将小于值x的结点放到所有大于等于值x的结点的前面,不要改变结点之间的顺序(例如1,4,3,2,5,2 将2结点提到至4的前面,但4,3,5的顺序不变);
思路:设置一个变量,记录下链表中第一次出现大于等于值x结点的位置insertPos。之后遍历链表,将所有小于值x的结点提到这个位置上;
需要注意的是,提取结点时的操作:1.当前结点的上一个结点的next指向当前结点的next;2.当前结点的next指向insertPos的next,insertPos的next指向当前结点;
链表的题目主要是考察对链表的操作,以及边界情况的处理;
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode partition(ListNode head, int x) {
ListNode preHead=new ListNode(0);
preHead.next=head;
ListNode pre=preHead;
ListNode cur=head;
ListNode insertPos=null;
while(cur!=null){
//定位需要插入的位置;
if(cur.val>=x && insertPos==null){
insertPos=pre;
}
//插入操作;
if(cur.val<x && insertPos!=null){
pre.next=pre.next.next;
cur.next=insertPos.next;
insertPos.next=cur;
insertPos=insertPos.next;
cur=pre.next;
continue;
}
pre=pre.next;
cur=cur.next;
}
return preHead.next;
}
}