编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。
示例:
输入: head = 3->5->8->5->10->2->1, x = 5
输出: 3->1->2->10->5->5->8
方法1:双指针/交换值
/**
* 类似荷兰国旗的想法,prev指针指向小于x的 ,cur游走进行判断
*
* @param head
* @param x
* @return
*/publicListNodepartition(ListNode head,int x){ListNode prev = head, cur = head;while(cur !=null){if(cur.val < x){//当前节点的值需要进行交换int t = prev.val;//先存下来prev的val
prev.val = cur.val;//swap
cur.val = t;
prev = prev.next;//prev跳到下一个指针}
cur = cur.next;//cur一直游走}return head;}
方法2:双指针/两个指针遍历
publicListNodepartition(ListNode head,int x){ListNode left =newListNode(-1), right =newListNode(-1);ListNode leftDummy = left, rightDummy = right;while(head !=null){if(head.val < x){
left.next = head;
left = left.next;}else{
right.next = head;
right = right.next;}
head = head.next;}//比如[1,4,3,2,5,2] x=3这个例子, leftDummy->1->2->2 如果没有断开操作,// 那 rightDummy->4->3->5->2就不正确了,因为原链表中5->2,没有断开,导致后面拼接操作会把这个链表成环
right.next =null;
left.next = rightDummy.next;return leftDummy.next;}
面试题 02.04. 分割链表编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。示例:输入: head = 3->5->8->5->10->2->1, x = 5输出: 3->1->2->10->5->5->8方法1:双指针/交换值/** *