这个题目中的 “分隔”并不是真正意义上分隔,将一个链表分隔成两个链表。
而是说 以一个整形数据x,让链表以 val 和 x 之间的大小差距进行数组分隔,val值小于x的节点,位于左边,大于和等于则位于整个链表的右边。
而且还有一个要求: 不能是 “无序的”,按照原有相对位置。
什么意思呢?假设 x == 3 , 第一个 节点的值 是 1,小于x值,而且本身就位于左边,我们就不用去移动它的位置了。这就是题目中 的 保留每个节点的初识相对位置,
再换一个说法 : 看到上面那个图中的 val 为 2 的节点没?它 和 val值为1的节点 ,val值都小于 x值(3),位于 链表的左边,但是由于它原先就位于 1 的右边,那么“分隔”后的结果 这个2节点 应该在 1 节点的后面。
这就是 保留 每个节点的初识相对位置。
建立 两个傀儡头节点 small 和 large,small 用来连接 val 值小于x的节点,large 用来连接 val 值大于或等于的节点。
再为 small 和 large 两个头节点创建2个替身变量 smallHead 和 largeHead,让它们记住small 和 large 的头节点的位置,让small 和 large 去 连接/遍历 各自的链表。(嗯。好像对 small 和 large 不厚道,谁让新建的两个节点引用带个 头head 呢? 嗯 ,没错!是这样的。)
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode small = new ListNode();
ListNode smallHead = small;
ListNode large = new ListNode();
ListNode largeHead = large;
while(head != null){
if(head.val < x){
small.next = head;
small = small.next;
}else{
large.next = head;
large = large.next;
}
head = head.next;
}
large.next = null;
small.next = largeHead.next;
return smallHead.next;
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/DarkAndGrey/article/details/122137412
内容来源于网络,如有侵权,请联系作者删除!