题目描述:
思路解析:
直接拆分:简单来说就是通过遍历原链表,将其拆分成两个子链表,其中一个链表a所有元素都小于x,另一个链表b所有元素大于或等于x,遍历完后将a的尾跟b的头相连即可。
注意:记得最后将链表b的尾节点的next设为空,因为链表b的尾节点后面可能还有原链表的其他节点。例如:
如图:若x等于3,则图中标红的large节点为链表b的尾节点,但其后面还有一个节点2
(红框部分),为了防止最后遍历新链表时出错,因此将large的next设为null。
伪代码:
//直接拆分(分隔链表)
class Solution {
public ListNode partition(ListNode head, int x) {
ListNode small = new ListNode(0);//设置哨兵位
ListNode smallHead = small;//记录哨兵位的节点
ListNode large = new ListNode(0);//设置哨兵位
ListNode largeHead = large;//记录哨兵位的节点
//遍历原链表
while (head != null) {
if (head.val < x) {//存放节点的值小于x的所有节点
small.next = head;
small = small.next;
} else {//存放节点的值大于或等于x的所有节点
large.next = head;
large = large.next;
}
head = head.next;
}
//为了防止large后面还有其他节点,因此将其next设为空
large.next = null;
//节点值小于x的链表的尾节点与节点值大于或等于x的链表的头节点相连
small.next = largeHead.next;
//返回连接好的新链表
return smallHead.next;
}
}
测试结果:
这道题的介绍到这里就结束了,如果你觉得本篇文章对你多少有些帮助,可以点个赞或者收藏一波支持支持,欢迎各位大佬批评指正,咱们下次再见!