旅游网站色彩搭配/北京网站优化外包
对于一个链表,我们需要用一个特定阈值完成对它的分化,使得小于等于这个值的结点移到前面,大于该值的结点在后面,同时保证两类结点内部的位置关系不变。
思路:
采用双指针思想,维护node1指针作为前面的插入指针,node2作为后面的删除指针。此时分为两种情况:
- 若链表首节点值大于或等于给定值,首先找到其后第一个小于给定值的节点删除并插入到 node2 之前作为头节点,并令 node1 指向它,然后将 node2 指向原删除节点的下一个节点
- 若链表首节点值小于给定值,那么首先找到从左往右第一个大于或等于给定值的节点 node2,并令 node1 指向其前一个节点
这样从 node2 开始依次向后遍历,每次找到一个小于给定值的节点,就将其删除并插入到 node1 指向节点之后,然后令 node1 指针右移一位,直到 node2 指向NULL
//思路:一拆为二然后合并
function partition(head, x) {//node1记录当前最新的小于x的值,node2记录当前最新的大于等于x的值let node1 = new ListNode(0), node2 = new ListNode(0);//cur1指向表头,cur2指向第一个大于等于x的值得位置let cur1 = node1, cur2 = node2;while (head != null) {if (head.val < x) {node1.next = head;node1 = node1.next;} else {node2.next = head;node2 = node2.next;}head = head.next;}node1.next = cur2.next;node2.next = null; //以null结尾return cur1.next;
}