面试题:分割链表
给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你不需要 保留 每个分区中各节点的初始相对位置。
示例 1:
输入:head = [1,4,3,2,5,2], x = 3
输出:[1,2,2,4,3,5]
示例 2:
输入:head = [2,1], x = 2
输出:[1,2]
提示:
- 链表中节点的数目在范围 [0, 200] 内
- -100 <= Node.val <= 100
- -200 <= x <= 200
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/pa… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
我们可以创建两个链表,用来存放大于或等于x的节点,以及小于x的节点,并且创建两个节点指向这两个链表的头部
let small = new ListNode(-1),
sm = small,
big = new ListNode(1),
bg = big;
然后遍历传进来的head,判断head的链表,小于x的节点存放在small中,sm移动,令sm保持一直指向small的尾节点,big和bg同理
while (head) {
if (head.val < x) {
sm.next = head;
sm = head;
} else {
bg.next = head;
bg = head;
}
head = head.next;
}
最后把他们的尾节点的next都设为null,然后连上,输出即可
sm.next = null;
bg.next = null;
sm.next = big.next;
return small.next;
完整代码
var partition = function (head, x) {
if (!head) return head;
let small = new ListNode(-1),
sm = small,
big = new ListNode(1),
bg = big;
while (head) {
if (head.val < x) {
sm.next = head;
sm = head;
} else {
bg.next = head;
bg = head;
}
head = head.next;
}
sm.next = null;
bg.next = null;
sm.next = big.next;
return small.next;
};