LeetCode ---- 86、分隔链表

题目链接

思路:

遍历链表,对链表进行分割,小于x的组成一条新链表,大于等于x的组成一条新链表

最后将两条链表连接在一起即可

    public ListNode partition(ListNode head, int x) {
        if (head == null || head.next == null) {
            return head;
        }
        // 小于x的链表的头节点
        ListNode lessHead = null;
        // 小于x的链表的尾节点
        ListNode lastLess = null;
        // 大于等于x的链表的头节点
        ListNode moreHead = null;
        // 大于等于x的链表的尾节点
        ListNode lastMore = null;
        ListNode cur = head;
        while (cur != null) {
            if (cur.val < x) {  // 当前节点值小于x
                // 设置小于x的链表的头节点
                lessHead = lessHead == null ? cur : lessHead;  
                // 设置小于x的链表的尾节点
                lastLess = lastLess == null ? lessHead : lastLess; 
                // 若当前节点不是小于x的链表的头节点,则连接在尾节点后面,并更新尾节点
                if (cur != lessHead) {
                    lastLess.next = cur;
                    lastLess = cur;
                }
            } else {   // 当前节点值大于等于x
                // 设置大于等于x的链表的头节点
                moreHead = moreHead == null ? cur : moreHead;
                // 设置大于等于x的链表的尾节点
                lastMore = lastMore == null ? moreHead : lastMore;
                // 若当前节点不是大于等于x的链表的头节点,则连接在尾节点后面,并更新尾节点
                if (cur != moreHead) {
                    lastMore.next = cur;
                    lastMore = cur;
                }
            }
            cur = cur.next;
        }
        // 存在小于x的节点时,需要连接大于等于x的链表
        if (lastLess != null) {
            lastLess.next = moreHead;
        }
        // 存在大于等于x的链表时,需要将尾节点的next指向null,防止出现环
        if (lastMore != null) {
            lastMore.next = null;
        }
        return lessHead == null ? moreHead : lessHead;
    }
    class ListNode {
        int val;
        ListNode next;
        ListNode(int x) { val = x; }
    }

猜你喜欢

转载自blog.csdn.net/sinat_34679453/article/details/107189176