09、分隔链表(JAVA)--链表

81 阅读1分钟

题目描述:

image.png 题目链接:leetcode.cn/problems/pa…


思路解析:

直接拆分:简单来说就是通过遍历原链表,将其拆分成两个子链表,其中一个链表a所有元素都小于x,另一个链表b所有元素大于或等于x,遍历完后将a的尾跟b的头相连即可。

注意:记得最后将链表b的尾节点的next设为空,因为链表b的尾节点后面可能还有原链表的其他节点。例如:

image.png 如图:若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;
    }
}

测试结果:

image.png


这道题的介绍到这里就结束了,如果你觉得本篇文章对你多少有些帮助,可以点个赞或者收藏一波支持支持,欢迎各位大佬批评指正,咱们下次再见!