题目

分隔列表 - 图1

解题思路

1、根据题意,需维护两个链表 small 和 large ,small 链表按顺序存储所有小于 x 的节点,large 链表按顺序存储所有大于等于 x 的节点。遍历完原链表后,只要将 small 链表尾节点指向 large 链表的头节点就是最终的结果。

2、设smallHead 和 largeHead 分别为两个链表的哑节点,它们的 next 指针指向链表的头节点,这样更方便处理头节点为空的边界条件。同时设small 和large 节点指向当前链表的末尾节点。开始时 smallHead=small,largeHead=large。

3、从前往后遍历链表,判断当前链表的节点值是否小于 x,如果小于就将 small 的 next 指针指向该节点,否则将large 的next 指针指向该节点。遍历结束后将 large 的 next 指针置空,因为当前节点复用的是原链表的节点,而其next 指针可能指向一个小于 x 的节点,我们需要切断这个引用。同时将small 的 next 指针指向largeHead 的 next 指针指向的节点,即真正意义上的large 链表的头节点。最后返回 smallHead 的 next 指针就是答案。

代码

  1. class Solution {
  2. public ListNode partition(ListNode head, int x) {
  3. ListNode small = new ListNode(0);
  4. ListNode smallHead = small;
  5. ListNode large = new ListNode(0);
  6. ListNode largeHead = large;
  7. while (head != null) {
  8. if (head.val < x) {
  9. small.next = head;
  10. small = small.next;
  11. } else {
  12. large.next = head;
  13. large = large.next;
  14. }
  15. head = head.next;
  16. }
  17. large.next = null;
  18. small.next = largeHead.next;
  19. return smallHead.next;
  20. }
  21. }