86. 分隔链表

121 阅读1分钟

题目描述

思路

  • 先分成两个链表,一个里面存大于x的节点,另一个存小于x的节点。然后把两个链表连起来。
    • cur指向原链表。
    • cur1指向新链表1,用cur1往新链表1后面追加满足条件的节点。
    • cur2指向新链表2,用cur2往新链表2后面追加满足条件的节点。
    • 注意:如果这里直接用cur1 cur2指向原链表中的元素,不new新的节点的话,要注意及时释放,否则可能造成一个节点被多次指向

代码

class Solution {
    public ListNode partition(ListNode head, int x) {
        if (head == null) return head;
        ListNode dummy1 = new ListNode();//<x部分
        ListNode dummy2 = new ListNode();//>=x部分
        ListNode cur1 = dummy1;
        ListNode cur2 = dummy2;
        ListNode cur = head;
        while (cur != null) {
            if (cur.val < x) {
                cur1.next = cur;
                cur1 = cur1.next;
                cur = cur.next;//在释放前进行这一步
                cur1.next = null;//一定要释放,不然可能多个指针指向一个节点,最后两段合并会导致有环。
            } else {
                cur2.next = cur;
                cur2 = cur2.next;
                cur = cur.next;//在释放前进行这一步
                cur2.next = null;//一定要释放,不然可能多个指针指向一个节点,最后两段合并会导致有环。
            }
        }
        cur1.next = dummy2.next;
        return dummy1.next;
    }
}