Leetcode 86. 分隔链表
好久没做链表的题啦,这道题还是比较好理解的!加了详细的注释,方便日后复习,也希望能帮到其他小伙伴,如有错误,欢迎指正!
Java实现:
class Solution {
public ListNode partition(ListNode head, int x) {
// 思路非常简单,尽量将时间复杂度降到O(n),我们将原链表中小于x的节点放到一个链表中,其余都放到另一个链表中,最后再将前者和后者连接起来
ListNode low_x = new ListNode(0); // 用来存储小于x的节点
ListNode high_x = new ListNode(0); // 用来存储大于于或等于x的节点
ListNode cur_low = low_x; // 定义一个指针指向low_x链表的尾节点
ListNode cur_high = high_x; // 定义一个指针指向high_x链表的尾节点
// 当前节点不为null就一直遍历
while (head != null){
// 如果当前遍历的节点值小于x
if (head.val < x){
// cur_low的尾节点的next指向当前节点
cur_low.next = head;
// 尾节点向后移动一位
cur_low = cur_low.next;
}else{
// cur_high的尾节点的next指向当前节点
cur_high.next = head;
// 尾节点向后移动一位
cur_high = cur_high.next;
}
// 当前节点head执行下一个节点(遍历原链表)
head = head.next;
}
// 由于java的链表不指定尾节点的next为null会自动成环,我们需要指定一下
cur_high.next = null;
// 将两个链表连起来
cur_low.next = high_x.next;
// 返回low_x链表的第一个非0节点(第一个节点其实是我们设定的dummy节点)
return low_x.next;
}
}