86. 分隔链表
这里我们采用手动模拟的方法,我们称输入的链表为主链。
利用两条链表,一条存储比x严格小的元素,另一条存储大于等于x的元素。
每次利用tmp到达一个新的ListNode,判断这个节点所属类别。以small为例:
// small 每次指向small链条中最后一个元素
small.next = tmp; //更新最后一个元素
tmp = tmp.next; //主链往后移动一个位置
small = small.next; //将small移动到最后一个元素
small.next = null; //将small的next与主链断开
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
// 用于打印出这个节点所有内容从而进行调试
public void printNode(ListNode l){
while(l!=null){
System.out.print(l.val+" ");
l = l.next;
}
System.out.print("\n");
}
public ListNode partition(ListNode head, int x) {
// small 用于存储<x的元素,big来存储>=x的元素,这两个指针始终指向最后一个元素(方便添加新的元素)
ListNode small = new ListNode(0);
ListNode big = new ListNode(0);
ListNode smallhead = small;
ListNode bighead = big;
ListNode tmp = head;
while(tmp!=null){
if(tmp.val<x){
small.next = tmp;
tmp = tmp.next;
small = small.next;
small.next = null;
}
else
{
big.next = tmp;
tmp = tmp.next;
big = big.next;
big.next = null;
}
}
small.next = bighead.next; //因为small是small里面最后一个元素
return smallhead.next;
}
}
结果: