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; } }