问题前置
如何让链表按照我们给定的数值进行节点划分呢,比如head=[1,4,3,2,5,2] 给定数值x=3,让head=>>[1,2,2,4,3,5],大于3的节点在左边部分,小于3的在右边部分,而且节点的相对位置不变?
题目描述
分隔链表: 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
你应当 保留 两个分区中每个节点的初始相对位置。
示例 1:
输入:head = [1,4,3,2,5,2], x = 3 输出:[1,2,2,4,3,5]
解题思路
- 既然要分隔链表,那么其实相当于有
两个部分的链表拼接成的
,一部分是小于x的
,另一部分大于等于x
- 那么我们就定义两个链表先把小于x和大于等于x的节点存起来,最后让小于x的尾节点连接大于等于x链表的头节点即可
- 要保证保留每个节点的初始相对位置,只要按照原链表的遍历顺序给两个新链表赋值即可
开始解题
var partition = function(head, x) {
if(!head) return null;
let smallNode = new ListNode(), bigNode = new ListNode(),cur = head;
let small = smallNode, big = bigNode; //定义两条链表及对应的操作指针
while(cur) {
if(cur.val < x) {
small.next = cur; // 让小于x的节点变成small的下一个节点
small = cur;
}else {
big.next = cur;
big = cur;
}
let next = cur.next; //保存cur.next,因为我们要把cur对应的节点断开存到新链表中,那么需要有指针保存cur后面的节点
cur.next = null; // 让cur断开与原链表的指针指向null,这个时候cur对应的节点就被放到了先链表中
cur = next;
}
small.next = bigNode.next; // small指针停留在尾节点,指向bigNode的下个节点即可;
return smallNode.next;
};