【LeetCode 面试题02.04】分割链表,编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。

学习目标:

目标:熟练运用Java所学知识


学习内容:

本文内容:使用Java实现:分割链表


题目描述:

编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前。如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示)。分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间。

示例:

输入: head = 3->5->8->5->10->2->1, x = 5
输出: 3->1->2->10->5->5->8

解题思路

创建两个新链表,一个存放比给定值小的结点,一个存放比给定值大的结点,最后将两个链表拼接

  • 首先判断链表为空和只有一个节点的情况
if(head==null)return null;//为空链表
if(head.next==null) return head;//只有一个节点
  • 创建两个新链表
ListNode min =new ListNode(0);//创建小于给定值的链表
       ListNode minTail=min;
       ListNode max=new ListNode(0);//创建大于给定值的链表
       ListNode maxTail=max;
       ListNode cur=head;
  • 通过循环比较,将相应结点存放至相应链表,将连个链表拼接起来
   //比较链表节点与给定值并存入相应链表
       while(cur!=null){
    
    
           if(cur.val<x){
    
    
               minTail.next=new ListNode(cur.val);//后插入链表
               minTail=minTail.next;
           }else{
    
    
               maxTail.next=new ListNode(cur.val);//后插入链表
               maxTail=maxTail.next;
           }

           cur=cur.next;
       }
       minTail.next=max.next;//将两个链表拼接起来

实现代码

  public static ListNode partition(ListNode head, int x) {
    
    
        if(head==null)return null;//为空链表
        if(head.next==null) return head;//只有一个节点
        ListNode min =new ListNode(0);//创建小于给定值的链表
        ListNode minTail=min;
        ListNode max=new ListNode(0);//创建大于给定值的链表
        ListNode maxTail=max;
        ListNode cur=head;
        //比较链表节点与给定值并存入相应链表
        while(cur!=null){
    
    
            if(cur.val<x){
    
    
                minTail.next=new ListNode(cur.val);//后插入链表
                minTail=minTail.next;
            }else{
    
    
                maxTail.next=new ListNode(cur.val);//后插入链表
                maxTail=maxTail.next;
            }

            cur=cur.next;
        }
        minTail.next=max.next;//将两个链表拼接起来
        return min.next;
    }

猜你喜欢

转载自blog.csdn.net/zhangxxin/article/details/114504059
今日推荐