86. 分隔链表

题目:

思路:

【1】模拟的方式

首先面对链表这个东西一般都是用指针辅助
如这种是分成两部分的
只需要生成
指向大元素的头节点指针 maxNode (因为是代表头指针的都是创建虚拟头节点)
指向小元素的头节点指针 minNode  
指向大元素的当前节点指针 maxCur  (因为是代表头指针的都是创建虚拟头节点)
指向小元素的当前节点指针 minCur 
然后遍历 链表 ,
如果归属于大元素则分到 maxNode 那里
如果归属于小元素则分到 minNode 那里
遍历完后要将他们最后节点的指向都断开 (因为保持旧指向会导致数据错乱)
这样剩下的就是将这两部分分类好的进行拼接即可(相对顺序是不变的因为顺序遍历下分配的情况相对顺序没有改动)

 

代码展示:

//时间0 ms 击败 100%
//内存40 MB 击败 54.73%
//时间复杂度: O(n),其中 n 是原链表的长度。我们对该链表进行了一次遍历。
//空间复杂度: O(1)。
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode partition(ListNode head, int x) {
        ListNode maxNode = new ListNode(-1);
        ListNode maxCur = maxNode;
        ListNode minNode = new ListNode(-1);
        ListNode minCur = minNode;
        while (head != null){
            if (head.val < x){
                minCur.next = head;
                minCur = minCur.next;
            }else {
                maxCur.next = head;
                maxCur = maxCur.next;
            }
            head = head.next;
        }
        // 切断之前的链接
        maxCur.next = null;
        // 再将两部分进行链接
        minCur.next = maxNode.next;
        return minNode.next;
    }
}

 

posted @ 2023-07-05 12:34  忧愁的chafry  阅读(14)  评论(0编辑  收藏  举报