题目
给一个链表头节点head和一个特定值x,对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
一个链表里,指定其中一个数值,让小于它的都放在该值或者大于等于该值的前面,大于等于该值的按照原始位置放置。
分析一波
重建两个新链表,bigList,smallList分别记录数值,
把大于等于指定数值的值按照初始位置放在big链表里,
把小于指定值的值放在smallList链表里,
最后把两链表连接起来,
也就是说把smallList链表的最后一个节点的下一个节点指向bigList链表的头节点。
利用双指针。
bigNode和smallNode指针分别等于bigList和smallList。cur指的是原始链表的头节点。
实践,上代码
/**
* @param {ListNode} head
* @param {number} x
* @return {ListNode}
*/
var partition = function(head, x) {
if(!head) return null;
let bigList=new ListNode(),smallList=newListNode(),bigNode=bigList,smallNode=smallList,cur=head,next;
while(cur){
next=cur.next;
cur.next=null;
if(cur.val < x){
smallNode.next=cur;
smallNode=cur;
}else{
//这里与上面同理
bigNode.next=cur;
bigNode=cur;
}
cur=next;
}
smallNode.next=bigList.next;
//这时候smallList已经和bigList链表连接起来了,应该返回smallList的next,不然头部会多一个0.
return smallList.next;
};
没有head,就退出;
定义bigList和smallList,然后让bigNode和smallNode分别等于它们;
用while循环去走链表:
smallNode.next=cur; 这里是把cur的值赋值给smallNode的下一个节点。
smallNode=cur;
这里为什么也要把cur赋值给smallNode,因为说到底是要让smallNode往前走一步,不然下次给smallNode赋值,就会永远覆盖上次赋值的值。没有往前走,原地踏步。
smallNode.next=bigList.next;
这里是把smallList链表和bigList链表连接起来。
把bigList链表的头节点也就是bigList.next赋值给smallList链表的最后一个节点的下一个节点(smallNode.next)
这时候smallList已经和bigList链表连接起来了,应该返回smallList的next,不然头部会多一个0.